[英]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;
當您刪除數組時。
不要將malloc
和new
混合使用(首先是出於樣式原因,然后是因為您永遠不應該delete
由malloc
分配的內存或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 -m
中bash
在你的終端)用於測試目的(如做malloc
-或new
-失敗更容易,以確保你處理那種失敗的不夠好)。
這樣好嗎
不完全的。 有幾個問題。 一個-您對free
使用的麻煩-我們將在稍后解決。 但是首先,將new[]
與delete
(non- []
)一起使用會調用未定義的行為:
在這里,您使用的是new []
:
nEncodedBytes = new unsigned char[m_lLenCompressedBytes];
在這里,您使用的是delete
:
delete (nEncodedBytes);
應該是:
delete [] nEncodedBytes;
將new
的[]
用於非[]
形式的delete
調用未定義行為。 現在,實際上,我所知道的所有編譯器和平台都可以很好地處理這種情況,並在特定情況下可以達到預期的效果,但是您永遠不應依賴未定義的行為。
現在供您使用malloc
和free
:
我不確定為什么在一個地方使用delete,而在另一個地方使用free。
你可能不應該。 這是一個經驗法則:
在C ++中,請始終使用
new
和delete
; 永遠不要使用malloc
和free
。
是的,有例外,但首先是罕見的,其次您將確切知道例外何時開始播放。 在您在此處發布的示例中,我認為沒有理由強迫使用malloc
和free
。 因此,您不應該如此。
與流行的看法相反,在單個C ++程序中混合new
/ delete
和malloc
/ free
本身並不會調用Undefined Behavior或使您的程序格式錯誤。 如果做得正確,就可以做到。 但是你還是不應該。
有內存泄漏嗎?
好吧,因為您已經調用了Undefined Behavior,所以可能會發生。 未定義的行為意味着任何事情都可能發生 。 但是,您正在取消分配在顯示的代碼中分配的所有內容。 因此,除了UB,我在這里看不到任何內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.