2013-08-21 23 views
0
vector<ClassX> xVec; 

if (inputFile.peek() == '$') 
{ 
    classX classXInstance;   //<==================== local instantiation 
    readFileElements(classXInstance);//<== pass by reference 
    if(classXInstance.validate()) 
    { 
     xVec.push_back(classXInstance);///<=============== added here 
    } 
    /// destructor of the local copy is called here 
} 

我得到一個核心轉儲,試圖調試,但是我得到這麼多的垃圾郵件與gdb,我可以看到該矢量被損壞,不知道是否因爲析構函數被調用是一個原因?類範圍問題的向量?

編輯:

我班這個樣子的

class ClassX 
{ 
public: 
    ClassX() { numberOfX=0; ppXX = NULL; }; 
    ~ClassX(); 
    void validate(); 
    char **setX(const vector<string>& Xss); 
    inline char **getX() {return ppXX;}; 
private: 
    int numberOfX; 
    char **ppXX; 
}; 

,它包含析構函數如下

ClassX::~ClassX() 
{ 
    if (ppXX != NULL) 
    { 
     for(int i=0; i < numberOfXX; i++) 
     { 
      if (ppXX[i] != NULL) 
      { 
       delete [] ppXX[i]; 
       ppXX[i] = NULL; 
      } 
     } 

     // Free array of pointers. 
     delete [] ppXX; 
     ppXX = NULL; 
    } 
} 

的setX的分配所有必要的內存

驗證給予我是ppX的打印輸出X [i]和如果元件的數目相匹配的字符串矢量

+7

而你遵循[ClassX]的[三規則](http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29)? –

+1

你可以發佈'ClassX'的定義嗎?在'push_back()'的調用下將創建一個'classXInstance'副本。如果'ClassX'具有任何動態分配的成員,則必須遵循三個規則。或者,如果C++ 11支持,它可以被移動:'xVec.push_back(std :: move(classXInstance));'。 – hmjd

+1

我是al-but-guaranteeing'readFileElements()'爲'ClassX'的成員變量執行動態分配,並且所述-class不符合[Rule of Three](http://en.wikipedia.org/wiki)/Rule_of_three_(C%2B%2B_programming)) – WhozCraig

回答

1

classXinstance副本被存儲到xVec的大小在存儲器返回true,用指針ppXX到的區域。現在你有兩個對象指向同一個區域。片刻之後,classXinstance被銷燬,所以該地區受delete的約束。 xVec中的元素現在指向無效的內存。

最好的選擇是使用std::Vector<std::string>而不是char **ppXX;一個字符串矢量處理引用和分配,所以你不必擔心正確的構造/複製/銷燬。

+0

是的,我知道,但我試圖發送ppXX這是argv execv(常量字符*路徑,字符*常量argv []);系統調用,所以它必須是一個雙指針 – aah134

+0

@abdul不,你可以在調用exec()之前從'string'轉換爲'char **';沒有必要以這種形式在內部存儲它。 – trojanfoe

+0

將它轉換爲char **作爲execv()之前的最後一步;這種方式,並與字符串的矢量,計算機將幫助您的內存管理。創建一個std :: vector 參數,用每個字符串的data()填充它,最後運行execv(path,arguments.data()) –