繁体   English   中英

STL向量,指针和类

[英]STL Vectors, pointers and classes

假设我有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()方法中分配的内存可能会损坏?

谢谢!

简而言之,这可以正常工作。

在Initialize中分配的内存在堆上。 这意味着堆栈中的更改不会影响此存储器的内容。

我对Class1看到的一个问题是,它不是复制安全的,但是复制和赋值构造函数尚未被禁止。

这可能会引起问题,因为Class1的析构函数被标记为释放mVec所有项目的mVec 使用隐式运算符,这意味着您最终将有两个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&);
};

它应该可以工作(当然, mPtrClass1mPtrClass1是有效的指针)。

我可以建议您在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,则不会在检查析构函数时遇到问题。

关于您的问题,请参阅我在新运算符中添加的位置。 您尚未初始化变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM