簡體   English   中英

釋放*時C ++內存泄漏?

[英]C++ Memory leak when freeing *?

我在空白中使用此:

unsigned char *nEncodedBytes = NULL;
nEncodedBytes = new unsigned char[m_lLenCompressedBytes];

short *shrtDecoded = NULL;
shrtDecoded = new short[iCountDecodedShorts];

short *m_ShortOut;
m_ShortOut = (short*)malloc(( 960*6)*sizeof(short));

unsigned char *m_DataBytes;
m_DataBytes = (unsigned char*)calloc((960*6),sizeof(char));

完成后,我使用釋放內存

delete (nEncodedBytes);
delete (shrtDecoded);

    free(m_DataBytes);
    free(m_ShortOut);

這樣好嗎 我不確定為什么在一個地方使用delete,而在另一個地方使用free。 我復制了我的代碼。

有內存泄漏嗎?

謝謝。

使用malloc時可以使用free 在所有情況下,您都不應該在C ++中使用malloc 這是C的處理方式,在C ++中很少使用。

使用new分配時,可以使用delete new調用構造函數以及分配內存, delete調用析構函數以及釋放內存。 因此,這些是面向對象的C ++選項。 但是,有皺紋。 因為C ++的實現不知道如果分配數組時指針是指向數組還是指向單個對象(例如nEncodedBytes = new unsigned char[m_lLenCompressedBytes]; ),則應使用delete[]而不是delete來釋放它。

請注意,不調用delete[]僅意味着您將僅調用數組中第一個對象的析構函數,因此, 在這種特殊情況下 ,調用delete[]與調用delete之間的結果應該沒有區別,因為char具有沒有破壞者。

我看不到您的代碼中發生內存泄漏,但是由於您尚未發布所有代碼,因此我們無法告知。

你應該用

delete [] nEncodedBytes;
delete [] shrtDecoded;

當您刪除數組時。

不要將mallocnew混合使用(首先是出於樣式原因,然后是因為您永遠不應該deletemalloc分配的內存或free new ed區域)。 考慮使用標准C ++容器 您甚至不需要顯式分配內存(庫將為您完成此操作)。 你可以編碼

std::vector<char> nEncodedBytes;
nEncodedBytes.resize(encodedbyteslen);

在Linux上,使用valgrind搜索內存泄漏。 順便說一句,您可能會對Boehm的GC感興趣,也許使用了這里的分配器。

順便說一句,使用自己的malloc您應該始終測試其結果,至少像

 SomeType* ptr = malloc(sizeof(SomeType));
 if (!ptr) { perror("malloc SomeType"); exit(EXIT_FAILURE); };

請記住, malloc可能會失敗。 您可能需要限制可用內存(例如使用ulimit -mbash在你的終端)用於測試目的(如做malloc -或new -失敗更容易,以確保你處理那種失敗的不夠好)。

這樣好嗎

不完全的。 有幾個問題。 一個-您對free使用的麻煩-我們將在稍后解決。 但是首先,將new[]delete (non- [] )一起使用會調用未定義的行為:

在這里,您使用的是new []

nEncodedBytes = new unsigned char[m_lLenCompressedBytes];

在這里,您使用的是delete

delete (nEncodedBytes);

應該是:

delete [] nEncodedBytes;

new[]用於非[]形式的delete調用未定義行為。 現在,實際上,我所知道的所有編譯器和平台都可以很好地處理這種情況,並在特定情況下可以達到預期的效果但是您永遠不應依賴未定義的行為。

現在供您使用mallocfree

我不確定為什么在一個地方使用delete,而在另一個地方使用free。

你可能不應該。 這是一個經驗法則:

在C ++中,請始終使用newdelete ; 永遠不要使用mallocfree

是的,有例外,但首先是罕見的,其次您將確切知道例外何時開始播放。 在您在此處發布的示例中,我認為沒有理由強迫使用mallocfree 因此,您不應該如此。

與流行的看法相反,在單個C ++程序中混合new / deletemalloc / free本身並不會調用Undefined Behavior或使您的程序格式錯誤。 如果做得正確,就可以做到。 但是你還是不應該。

有內存泄漏嗎?

好吧,因為您已經調用了Undefined Behavior,所以可能會發生。 未定義的行為意味着任何事情都可能發生 但是,您正在取消分配在顯示的代碼中分配的所有內容。 因此,除了UB,我在這里看不到任何內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM