簡體   English   中英

C / C ++字符串內存泄漏?

[英]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.

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