![](/img/trans.png)
[英]operator+ overload returning object causing memory leaks, C++
[英]Is returning a C++ std::string object safe from memory leaks?
我對C ++的字符串相當新手,所以下面的模式可能有點難看。 在開始使用更大的系統進行集成測試之前,我正在查看我編寫的一些代碼。 我想知道的是它是否安全,或者是否容易泄漏內存?
string somefunc( void ) {
string returnString;
returnString.assign( "A string" );
return returnString;
}
void anotherfunc( void ) {
string myString;
myString.assign( somefunc() );
// ...
return;
}
我的理解是,returnString的值被分配給一個新對象myString,然后在解析對somefunc的調用時銷毀returnString對象。 在myString超出范圍的某個時候,它也會被破壞。
我通常會將一個指向myString的指針傳遞給somefunc()並直接分配給myString的值,但我正在努力使我的代碼更清晰(並且更少依賴副作用函數樣式)。
是的,以這種方式(按值)返回一個string
是安全的,雖然我更喜歡這樣分配它:
string myString = somefunc();
這更容易閱讀,也更有效(保存空字符串的構造,然后下次調用assign
會覆蓋它)。
std::string
管理自己的內存,並且它具有正確編寫的復制構造函數和賦值運算符,因此以這種方式使用字符串是安全的。
是的,這樣做
return returnString
您正在調用字符串的復制構造函數 。 它將returnString的副本*執行到臨時(也就是rValue)中,取代了調用表達式中的“somefunc()”:
myString.assign( somefunc() /*somefunc()'s return becomes temporary*/);
這又被傳遞給assign並由assign用來執行myString的復制。
因此,在您的情況下,string的復制構造函數保證深層復制並確保沒有內存泄漏。
*請注意,這可能是也可能不是真正的深層副本,復制構造函數的行為是特定於實現的。 一些字符串庫實現了寫時復制,它具有一些內部簿記,以防止在實際需要之前進行復制。
你是完全安全的,因為你按字符串返回字符串,字符串將被“復制”,而不是通過引用。 如果你要返回一個std::string &
,那你就錯了,因為你有一個懸空引用。 有些編譯器甚至可以執行返回值優化 ,甚至在返回時也不會真正復制字符串。 有關更多信息,請參閱此帖子 。
是的,它(至少通常)是安全的。 幾乎任何合理的字符串類的最基本的貢獻之一是能夠像正常分配,返回等“正常工作”的基本值一樣行動。
至於你說的字符串returnString
是內部創建somefunc
和副本還給當函數返回。 這非常安全。
你想要的是將myString
引用到somefunc
(不要使用指針)。 非常清楚:
void somefunc( string& myString ) {
myString.assign( "A string" );
}
void anotherfunc( void ) {
string myString;
somefunc(myString);
// ...
return;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.