2016-11-13 43 views
0

這裏是C++的新手。以下可能導致內存泄漏?分配給解除引用的字符串 - 可以導致內存泄漏嗎?

// debug is optional, for debugging purposes. 
// Say my_string is an internal string class my company uses. 

int DoSomething(my_string *debug) { 
    const my_string& s = GetString(); 
    if (debug != nullptr) *debug = s; // Could this cause a memory leak? 
    return DoSomethingElse(s); 
} 

我想在這裏查看我的理解:我覺得在註釋行的內存區域指向debug只會被覆蓋有(副本)的s內容,除非有禁止複製構造函數實現my_string,在這種情況下,它也可能做一些其他的東西。

如果沒有特殊的拷貝構造函數my_string,那麼如果my_string指向其內部表示任何動態分配的內存(它有可能不會,因爲它可以容納任何長度的字符串),那麼上面的代碼會導致內存泄漏。

另外,關於預期C++「禮儀」的另一個問題,我猜 - 我應該能夠假設編寫my_string的人寫了一個複製構造函數以避免類似情況下的內存泄漏?也就是說,因爲我自己的代碼中沒有任何new,如果這段代碼導致內存泄漏,說這不是我的「錯誤」是否合理?

編輯:我想也許我的意思是複製賦值運算符而不是複製構造函數。

+2

'my_string'最好有一組單元測試來驗證它*不*泄漏,而且是一個可惡的使用它的原因,而不是'std :: string'。當然這可能會泄漏'my_string'。最後,如果你知道**它吸收並使用它,那麼是的,可以說人們可以得出結論,它仍然是你的錯。 – WhozCraig

+2

也許是的,也許沒有。這取決於這裏沒有顯示的代碼。 – juanchopanza

+0

@WhozCraig @juanchopanza它僅僅依賴於'my_string'的實現還是依賴於'GetString'和'DoSomethingElse'? – John

回答

-2

是的,它的錯,使用你認識不好的代碼不好總是你的錯。修復或解決它與許多意見,但從來沒有假裝其他人的問題。

代碼不會泄漏,但可能會崩潰。

會發生什麼是您返回一個指向該字符串的指針,但是當您離開函數時,原始字符串內存將被刪除。現在通常情況下內存在短時間內保持完好,但遲早(通常更早)會使用字符串佔用的內存,最好是垃圾,最壞的情況是崩潰。

您會注意到從GetString返回的my_string可能會創建一個臨時副本(您沒有顯示代碼),因此s會指向此臨時對象。如果GetString返回一個指向原始字符串的指針,那麼你就更安全了,但是現在你處於任何擁有GetString返回的原始字符串的地方。

返回被複制的字符串對象並返回副本(編譯器會優化它以便獲得最少的內存副本),或者返回shared_ptr,以便更好地處理所有權。

1

這在理論上可能是內存泄漏。但是,無論何時你正在編寫一個內部管理任何類型資源的類(並且我們經常這樣做),總是要尊重The Rule of FiveRAII。我的意思是,如果編寫my_string類的人是理智的,他們明確定義了複製操作符,所以泄漏永遠不會發生。另外,如果您不完全理解複製構造函數和複製運算符之間的區別,this question可能會有所幫助。

0

答案完全取決於my_string operator=(const my_string& s)的作用。如果他們引用您創建的本地臨時字符串所擁有的內存,那是他們的錯。如果你知道的話,你的。在這種情況下,它可能會崩潰。

另一方面,如果他們對傳遞給operator=的字符串進行了深層複製,那麼一切都很好,並且當您的本地字符串超出範圍時就沒問題。

您不應該擔心內存泄漏,而應該考慮字符串debug中可能存在的懸掛指針。