簡體   English   中英

從內存泄漏中返回一個C ++ std :: string對象是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM