[英]C/C++ string memory leaks?
我在我的應用程序中使用STL string
,我最近測試它是否存在內存泄漏,我注意到我的很多字符串在程序結束時沒有被正確釋放。
我用其中一個字符串測試了下面的代碼(不是逐字):
const string* cppString = &obj->objString;
const char* cString = cppString->c_str();
delete obj;
在那之后,我提出了一個斷點並注意到,雖然cppString
指向的string
不再存在,但cString
仍然指向一個C風格的字符串,這肯定是最后一個未能在最終解除分配的字符串。
我是否遺漏了C / C ++字符串的工作方式? 如何才能獲取要解除分配的字符串的C表示?
編輯:更多信息。 我的obj
類是Dialog
類型,它繼承了Popup
。 我認為可能是這樣,因為當我刪除obj
,我將其視為Popup*
,但我在一個小的單獨程序中嘗試它,並且作為父類刪除正確刪除子成員變量(這使得感覺,當然)。
我在VS中使用了內存泄漏跟蹤,並且它顯示最終泄漏的字符串是在我創建Dialog
時創建的字符串,並將objString
設置為作為對構造函數的引用傳遞的字符串。
謝謝,
Jengerer
您所看到的是未定義的行為 - 實際上並不是內存泄漏。 C字符串的內存已被釋放(至少就您而言),但那里的數據仍然可以在技術上訪問。 當您釋放內存時,內存通常不會被擦除,因此只要內存不會被后續分配重用,數據就會一直存在。
在取消分配數據之后讀取數據是未定義的行為:您可能會在數據被取消分配之前得到數據,您可能獲得垃圾數據,可能會使程序崩潰,或者您甚至可能擦除硬盤驅動器(盡管這不太可能)。
只要正確釋放std::string
對象,那么用於其C字符串表示的任何內存也將被釋放。 你不必擔心這一點。
編輯 :事實上,事實證明你的對象沒有被破壞,因為父類Popup
沒有虛擬析構函數。 結果,沒有調用子類Dialog
的析構函數,因此沒有調用std::string
實例的析構函數。
問題很可能不是在std::string
,而是在obj
(無論是什么類型)。 請注意,您刪除了obj
,而不是cppString
。 我的猜測是obj
不會在智能指針類中存儲objString
,也不會在析構函數中刪除objString
,因此你就有了這個漏洞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.