1

我有一個任務,寫一個動態分配二維數組的類,然後我必須編寫函數來處理它。其中一個功能是operator +的重載功能。一切都按預期工作,即使是運算符+函數,直到程序調用析構函數。析構函數具有釋放先前分配的內存的簡單工作。我知道代碼是正確的,我已經手動測試過,但是當計算機在程序結束時調用此函數時,出現「2DArray.exe中的0x000566E1未處理異常:0xC0000005:訪問衝突讀取位置0xFEEEFEF2」。 我嘗試了各種各樣的事情,現在我已經坐在這個問題上兩天了,而且我已經筋疲力盡了。本週五將到期。如果任何人都可以嘗試和幫助,我將不勝感激。c + +重載運算符+和動態內存分配

下面是我認爲問題被埋藏的兩個函數。另外,請注意,當沒有析構函數時,程序運行完全正常,但我必須確保在程序退出之前釋放內存,部分任務。

Square_Matrix Square_Matrix::operator+(Square_Matrix & object) 
{ 
    Square_Matrix sum; 
    sum.Set_Size(size); 
    for (int i = 0; i < size; i++) 
    { 
     for (int b = 0; b < size; b++) 
     { 
      sum.Set_Elem((matrix[i][b] + object.Get_Elem(i, b)),i, b); 
     } 
    } 
    return sum; 
} 

Square_Matrix::~Square_Matrix() 
{ 
    // destructor 
    // release the allocated memory 

    if (size > 0) 
    { 
     for (int d = 0; d < size; d++) 
     { 
      delete[] matrix[d]; 
     } 
     delete[] matrix; 

     size = 0; 
    } 
} 
+1

請顯示構造函數和複製構造函數,以防出現問題之一。 –

+0

在構造函數中如何分配內存?另外,set_size()是什麼樣的? –

+0

我沒有複製構造函數。這可能是問題嗎? – glina126

回答

1

看起來你需要一個拷貝構造函數。

另外,您對operator +的參數應爲const Square_Matrix &object。你不想改變第二個對象,是嗎?告訴編譯器。它會感激它。

其實,你沒有任何意圖要麼改變的第一個對象,所以你應該把它聲明Square_Matrix Square_Matrix::operator+(const Square_Matrix & object) const

第二const告訴編譯器,使this一個常量指針爲好。

+0

拷貝構造函數是這裏的關鍵。另外,出於某種奇怪的原因,我的編譯器不喜歡我做常量。它將對象強調爲語法錯誤。 object.Get_Elem(I,B) 給出此錯誤: 「常量方陣&對象 錯誤:該對象具有鍵入不與構件功能兼容限定符 對象類型是:const的方陣」 – glina126

0

當您刪除動態分配數組中的所有值時,您將釋放整個事物。

for (int d = 0; d < size; d++) 
{ 
    delete[] matrix[d]; 
} 

您必須刪除線

delete[] matrix; 

應該停止給該異常即可。