簡體   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