2017-02-28 91 views
0

此代碼塊是否會導致內存泄漏?該代碼塊是否會導致內存泄漏?

char * foo = new char [20]; 
read(STDIN_FILENO, foo, 20); 
string bar; 
bar.reserve(20); 
bar = foo; 
delete[] foo; 

我認爲它不能,因爲我們使用delete[]來釋放大塊內存。但是,對象bar可能在此處有所不同。請分享你的觀點。

+5

請不要試圖通過在stackoverflow上提出問題來學習C++。它只會讓每個人都感到痛苦,包括你在內。改爲閱讀[書籍](https://stackoverflow.com/questions/388242)。 – nwp

+7

如果出現'string bar;','bar = foo'或'bar.reserve(20)'的任何一個,則表示您有一個memleak。 – Jarod42

+2

家庭作業服務警報... – Chiel

回答

5

如果有任何string bar;,bar.reserve(20)bar = foo拋出,你有一個memleak。

你可以使用一些智能指針,以避免:

auto foo = std::make_unique<char[]>(20); 
0

你不需要儲備,如果你從標準輸入讀取的20個字節的一個是\ 0,你將填補只有幾個字節。

下面是正確的代碼:

char * foo = new char [20]; 
read(STDIN_FILENO, foo, 20); 
string bar; 
bar.assign(foo, 20); 
delete[] foo; 

...你可能對的std :: string有異常問題(構造函數或轉讓),但只有當你分配大量內存異常恕我直言,應如何處理內存數量,因爲如果20個字節的分配失敗,肯定無法正確處理異常。

如果我不得不提高你的代碼,無論是速度和安全,我會做這種方式:

char foo[20]; 
int len = read(STDIN_FILENO, foo, sizeof(foo)); 
string bar; 
if (len > 0) 
    bar.assign(foo, len); 
0

@ Jarod42是正確的。你應該使用智能指針。然而,爲了解決這個問題,而智能指針(理解理論),試試這個:

char * foo = new char [20]; 

try{ 
    read(STDIN_FILENO, foo, 20); 
    string bar; 
    bar.reserve(20); 
    bar = foo; 
    deleted=true; 
    delete[] foo; 
    } 
catch (...){ 
    delete[] foo; 
    throw; 

} 

如果在第一線之一異常,異常會被抓住,foo將仍然被刪除。但是,除非你有一個令人信服的理由,否則你應該使用unique_ptrshared_ptr

+0

你說的是不同的語言。 – rubenvb

+0

你是什麼意思? –

+0

非常抱歉。嘗試錯過了語法錯誤。我將編輯修復 –

0

如果你知道在編譯時的緩衝區大小,你不應該用新的分配它。相反,你應該把它分配到堆棧上,或者更好的是在調整它的大小後直接讀入你的字符串的緩衝區。這樣,您可以確保代碼明智和其他方面的最大效率,包括將分配與實際讀數分開。

相關問題