此代碼塊是否會導致內存泄漏?該代碼塊是否會導致內存泄漏?
char * foo = new char [20];
read(STDIN_FILENO, foo, 20);
string bar;
bar.reserve(20);
bar = foo;
delete[] foo;
我認爲它不能,因爲我們使用delete[]
來釋放大塊內存。但是,對象bar
可能在此處有所不同。請分享你的觀點。
此代碼塊是否會導致內存泄漏?該代碼塊是否會導致內存泄漏?
char * foo = new char [20];
read(STDIN_FILENO, foo, 20);
string bar;
bar.reserve(20);
bar = foo;
delete[] foo;
我認爲它不能,因爲我們使用delete[]
來釋放大塊內存。但是,對象bar
可能在此處有所不同。請分享你的觀點。
如果有任何string bar;
,bar.reserve(20)
或bar = foo
拋出,你有一個memleak。
你可以使用一些智能指針,以避免:
auto foo = std::make_unique<char[]>(20);
你不需要儲備,如果你從標準輸入讀取的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);
@ 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_ptr
或shared_ptr
如果你知道在編譯時的緩衝區大小,你不應該用新的分配它。相反,你應該把它分配到堆棧上,或者更好的是在調整它的大小後直接讀入你的字符串的緩衝區。這樣,您可以確保代碼明智和其他方面的最大效率,包括將分配與實際讀數分開。
請不要試圖通過在stackoverflow上提出問題來學習C++。它只會讓每個人都感到痛苦,包括你在內。改爲閱讀[書籍](https://stackoverflow.com/questions/388242)。 – nwp
如果出現'string bar;','bar = foo'或'bar.reserve(20)'的任何一個,則表示您有一個memleak。 – Jarod42
家庭作業服務警報... – Chiel