我遇到了以下错误.
Foo.该类的实例存储在std :: vector vec中class B.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)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |