0

我一直在研究一個代碼,其中有很多類。我將內存分配給構造函數中不同的對象數組。然而,當我認爲一切正常時,我遇到了一個奇怪的錯誤。例如,假設我有一個名爲Points的類,它有一個稱爲數據的雙點數組。使用此指針時C++析構函數錯誤的原因是什麼?

好吧,我現在發佈的所有代碼:

class Points 
{ 
     double *data; 

     Points::Points() 
     { 
      data = new double [C_NUMBER_OF_POINTS]; 
     } 

     Points::~Points() 
     { 
      delete [] this->data; 
     } 
}; 

調試我發現錯誤是與此指針後,我不知道爲什麼要這樣?調用析構函數刪除數據,而對象正在銷燬,但它仍在內存中。我的問題是爲什麼它是這樣的?

我得到的錯誤基本上是由於HandTracker.exe的內存處理不當

在0x778f15de未處理的異常:00000000: 操作成功完成。 大段引用

,如果我,如果我使用下面的析構函數中刪除這個指針意義上的錯誤被修正

 Points::~Points() 
     { 
      delete []data; 
     } 

我的問題是不完全有關如何處理內存泄漏,它是關於與有關這一特定問題這個指針。這個指針背後的機制是什麼使它產生這個錯誤?

+1

請張貼準確的代碼 - 在您的示例數據不是類 – 2012-08-08 01:46:28

+7

的成員,您是否按照[三種規則(http://stackoverflow.com/questions/ 4172722 /什麼,是最規則的三)? – 2012-08-08 01:47:40

回答

2

很可能,在您的代碼的某處,您複製了Points的實例或構建了一個引用到另一個實例。這與你的類創建了兩個實例,指針爲data。當第一個被銷燬時,它銷燬了兩個實例都有指針指向的對象。當第二個被訪問或銷燬時,它引發了這個問題,因爲該對象已經不存在了。

最好的解決方法是通過使用經過良好測試的類具有自己的析構函數來避免析構函數。例如,在這種情況下,std::array(或std::vector)。這將使一切「神奇地工作」,因爲這些類已經有適當的析構函數,複製構造函數和複製賦值運算符。

否則,請確保您有正確的複製構造函數和複製賦值運算符,因爲默認值(成員複製/複製)在您的情況下不起作用。請參閱詹姆斯麥克奈利斯關於三項規則的評論。

試試這個:

Points::Points(const Points &a) 
{ 
    data = new double[C_NUMBER_OF_POINTS]; 
    for (int i = 0; i < C_NUMBER_OF_POINTS; ++i) 
      data[i] = a.data[i]; 
} 

Points& operator=(const Points& a) 
{ // The key is that this overrides the catastrophic default -- data=a.data; 
    for (int i = 0; i < C_NUMBER_OF_POINTS; ++i) 
      data[i] = a.data[i]; 
    return *this; 
} 
+1

我可能會建議在'std :: vector'上使用'std :: valarray'或(如果C++ 11)'std :: array'。 – oldrinb 2012-08-08 02:41:56

+1

是的,用固定大小的數組可能會更好。我會更新。 – 2012-08-08 02:43:15

相關問題