2011-08-20 60 views
0

我不斷收到此錯誤,但我無法弄清楚何時可以刪除變量的動態內存:upSizedPlaintext,upsizedKey,upsizedCiphertext或upsizedKeyD?檢測到堆損壞,我可以在哪裏刪除動態內存?

因爲我這樣做的任務,我必須使用BOOST測試,並在講師將使用的測試中,他將刪除encryptedText並在BOOST測試中解密。但我無法設法找到我可以從上面刪除變量的地方。任何想法和任何幫助非常感謝?

另外,我必須使用C風格的字符串而不是C++字符串。

回答

1

貌似同樣的問題,我

char * decrypted = new char[lengthOfCiphertext]; 

應該

char * decrypted = new char[lengthOfCiphertext + 1]; 

在不同的地方同樣的問題。堆損壞並不是因爲您在錯誤的時間刪除,而是因爲您正在寫入分配的內存範圍之外。在這種情況下,因爲你正在分配一個太少的字節。

+0

這就是我原先的想法......我原來也是這樣想的,但後來我想了一些,並沒有想到它會起作用。修復後,我能在哪裏刪除提到的變量? – Brandon

+0

只有一個答案。當你不再需要使用內存。在你的情況下,它看起來像你正在'encrypt'中做的那樣,當你離開這個函數時,你不能再使用'upsizedPlainText'和'upsizedKey'指向的內存,所以刪除它們是正確的。但是在'decrypt'中,你分配內存但不會刪除它,所以這是內存泄漏。一般來說,追蹤何時刪除內存是安全的,這是一件非常困難的事情。還有一個原因,就是不按照你要求的方式使用堆分配。 – john

+0

啊,是的,我忘了在'decrypt'後面刪除它,但我現在將它添加並修復它。 – Brandon

0

您可以在可見的任何位置刪除這些變量。由於它們是函數內的局部變量,因此可以將它們刪除到該函數內的任何位置,或者將其作爲指針傳遞給它們的任何函數中。

刪除這些指針指向的內存和刪除這些變量的位置之間存在很大差異。有很多地方你不應該刪除它們。在傳遞變量的函數中刪除它們通常是一個壞主意。在函數完成使用前刪除它們是一個非常非常糟糕的主意。

您應該在最後一次使用和創建它們的函數返回之間的某個位置刪除它們。如果你完全不刪除它們,你就會有內存泄漏,如果你太早刪除它們,你的行爲就會不明確。

2

當您從加密和解密返回指向新內存的指針時,調用這些函數的代碼將負責調用它們接收的指針delete[]

不是一個非常好的接口,也是我們喜歡在C++代碼中使用std :: string的一個原因!

C代碼中堆損壞的常見來源是忘記字符串的nul終止符,並分配strlen(s)字節而不是strlen(s) + 1字節。我相信你在幾個地方這樣做。

+2

加上其他STL容器和智能指針,當我們不處理字符串。 –