向量相关的内存分配问题

mem*_*emC 5 c++ stdvector

我遇到了以下错误.

  • 我上课了Foo.该类的实例存储在std :: vector vecclass B.
  • 在类Foo中,我通过使用new和删除该对象来分配内存来创建类A的实例~Foo().

代码编译,但我在运行时崩溃了.如果我delete my_a从类的desstructor中禁用Foo.代码运行正常(但会有内存泄漏).

有人可以解释这里出了什么问题并建议修复?

谢谢!

class A{
      public:
          A(int val);
          ~A(){};
          int val_a;

};

A::A(int val){
       val_a = val;
       };

class Foo {      
      public:
             Foo();
             ~Foo();
             void createA();
             A* my_a;
};

Foo::Foo(){
    createA();
};

void Foo::createA(){
    my_a = new A(20);
};

Foo::~Foo(){
    delete my_a;

};



class B {
      public:
             vector<Foo> vec;             
             void createFoo();            
             B(){};
             ~B(){};
};


void B::createFoo(){
    vec.push_back(Foo());
};


int main(){
    B b;

    int i  =0;
    for (i = 0; i < 5; i ++){
        std::cout<<"\n creating Foo";
        b.createFoo();   
        std::cout<<"\n Foo created";
        }
    std::cout<<"\nDone with Foo creation";

    std::cout << "\nPress RETURN to continue...";
    std::cin.get();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 7

您需要为Foo实现复制构造函数和赋值运算符.每当你发现你需要一个析构函数时,你几乎肯定也需要这两个.它们在很多地方使用,特别是用于将对象放入标准库容器中.

复制构造函数应如下所示:

Foo :: Foo( const Foo & f ) : my_a( new A( * f.my_a ) ) {
}
Run Code Online (Sandbox Code Playgroud)

和赋值运算符:

Foo & Foo :: operator=( const Foo & f ) {
    delete my_a;
    my_a = new A( * f.my_a );
    return * this;
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是,不要动态地在Foo类中创建A实例:

class Foo {      
      public:
             Foo();
             ~Foo();
             void createA();
             A my_a;
};

Foo::Foo() : my_a( 20 ) {
};
Run Code Online (Sandbox Code Playgroud)