假设我有2个班级:
class Class1
{
public:
std::vector<CustomClass3*> mVec;
public:
Class1();
~Class1()
{
//iterate over all the members of the vector and delete the objects
}
};
class InitializerClass2
{
private:
Class1 * mPtrToClass1;
public:
InitializerClass2();
void Initialize()
{
mPtrToClass1->mVec.push_back(new CustomClass3(bla bla parameters));
}
};
这会有用吗?或者,在方法终止后,InitializerClass2 :: Initialize()方法中分配的内存可能会被破坏?
谢谢!
答案 0 :(得分:2)
总之,这样可以正常工作。
在Initialize中分配的内存在堆上。这意味着堆栈中的更改不会影响此内存的内容。
答案 1 :(得分:2)
我在Class1
看到的一个问题是,它不是复制安全的,但复制和赋值构造函数尚未被抑制。
这可能会导致问题,因为Class1
的析构函数被标记为释放mVec
中所有项目的内存。使用隐式运算符意味着最终会有2个Class1
实例指向相同的CustomClass3
实例,第二个析构函数将双重删除内存。例如
Class c1;
c1.mVec.push_back(new CustomClass3(...));
Class c2 = c1;
在这种情况下,要运行的第二个析构函数(c1)将释放已经删除的CustomClass3
实例。您应该禁用Class1
的复制构造和分配以防止此
class Class1 {
...
private:
Class1(const Class1&);
Class1& operator=(const Class1&);
};
答案 2 :(得分:1)
它应该工作(前提是mPtrClass1
是一个有效的指针)。
答案 3 :(得分:1)
我建议您在InitializerClass2中将构造函数更改为以下内容:
InitializerClass2() : mPtrToClass1(NULL){}
~InitializerClass2(){
if( mPtrToClass1 != NULL) delete mPtrToClass1;
}
void Initialize(){
if( mPtrToClass1 == NULL){
mPtrToClass1 = new InitializerClass1();
}
mPtrToClass1->mVec.push_back(new CustomClass3(bla bla parameters) );
}
如果你不打算使用RAII,那么你就不会遇到检查析构函数的问题。
关于您的问题,请参阅我在新运算符中添加的位置。你没有初始化你的变量。