2015-07-12 48 views
0

我的問題是關於下面的簡單代碼:std :: string如何保持內存超出範圍沒有泄漏?

#include <iostream> 

using namespace std; 

const char* call() 
{ 
    string str("Hey there."); 
    return str.c_str(); 
} 

int main() 
{ 
    const char* blah = call(); 
    cout << blah << endl; 

    system("pause"); 
    return 0; 
} 

輸出: 「嘿。」

現在,它是如何保持「你好」的記憶。當std :: string在方法結束時被銷燬時,它是不會被銷燬或導致內存泄漏的?我不是一個C++專家,但我相信如果字符串分配內存持有「嘿,那裏。」在堆棧中,當字符串超出作用域(方法結束)時,它將被刪除,並且如果字符串在堆上分配內存以存儲「Hey there」。那麼這會導致內存泄漏,因爲它顯然不會破壞內存,因爲我們在字符串超出範圍之後訪問內存。

那麼,我怎麼能夠訪問c_str()指向的內存塊而不會導致內存泄漏?

非常感謝您的迴應。

+5

愚蠢的運氣。您正在使用的內存位置尚未被重用。 – user4581301

+0

謝謝,user4581301。 –

+1

@ user4581301:實際上,我確實認爲它是_unlucky_它的工作!理想情況下,運行時系統會因不正確的代碼而失敗。在測試環境中這樣做的一個方法是使頁面無法訪問被刪除的內存。當然,這會產生一個緩慢的系統,但可能會揭示訪問陳舊數據的不少錯誤。另一種方法是在釋放類的析構函數之前用一些模式填充內存。 –

回答

1

我相信你的字符串技術上超出了範圍,但它不會立即從內存中'刪除'。它需要被覆蓋。當一個變量超出範圍時,機器不能保證它仍然有效,但是偶然的,它可能是可能是。當你去引用一個指針時,有一個機會舊的字符串信息仍然存在於內存中的那個位置。此外,術語「內存泄漏」僅用於使用關鍵字new動態分配內存,因爲當您丟失指向該數據的最後一個指針時,這意味着您無法訪問該數據。

+0

感謝您的回答!我指的是使用關鍵字new進行動態分配。和in一樣,std :: string對象存儲char數組「Hey there。」通過在堆上創建內存。堆=動態分配=新。 –

+0

@shawna:所有那些等號都是荒謬的,毫無根據的假設。 'std :: string'不使用'new';它使用提供的分配器。 –

+0

@KerrekSB堆=動態分配=新,是一個基本的計算事實。沒有做出任何假設。我不知道std :: string如何或在哪裏存儲它的內存,這就是爲什麼你看到我在原帖中說「如果」很多。 –