首頁>Program>source

現在我有一个必须返迴字元串的函式.我看到了一个特殊的實現,他从该函式返迴const char *。

類似這樣的东西:

const char * GetSomeString() 
{ 
  ........   
  return somestlstring.c_str(); 
}
SomeOtherFoo ()
{
  const char * tmp = GetSomeString();
  string s = tmp;
}

現在我覺得這有潜在的問题.我的內心感覺對吗? 還是這是完全安全的代碼?

請给我您的建議.我有一種返迴const char的感覺*這種方式可能会造成破壞。

谢谢, Arjun

最新回復
  • 5月前
    1 #

    取決於什麼 somestlstring 是,那裏正在做什麼。

    如果它是一个區域性變數,則您將一个指標返迴到在 GetSomeString時釋放的記憶體中 完成,所以它是一个悬空的指標和一个錯誤。

    這一切都归結為 somestlstring的一生 以及您對其執行的操作. .c_str()返迴的指標 保證仅在字元串中的下一个變異操作之前有效.所以,如果有什麼變化, 从致電 somestlstring.c_str()之前 如果您要詢問 s的寿命,那麼您將處於不確定的行為狀態。

  • 5月前
    2 #

    const char *返迴 std::string 该函式有效,直到您修改了从中获得的字元串或销毁了该字元串為止.从函式返迴它是可以的(尽管我不会說是很好的實践),只要您牢記這两个事實。

  • 5月前
    3 #

    在详细阐述@Neil的條件下,這是可以的.但是,更好的方法是返迴對字元串的引用

    c_str()
    

    請記住," somestlstring"一定不能是區域性自動變數,而必须儲存在名稱空間或類中的其他位置.否則,您可以按值返迴字元串

    string const& GetSomeString() 
    { 
      ........   
      return somestlstring; 
    }
    string s = GetSomeString();
    

  • 5月前
    4 #

    這不是很好-字元串的儲存空間会保留多长時間? 谁負责删除它? 是否需要將其删除?

    最好返迴一个負责分配和釋放字元串記憶體的字元串物件-這可以是std :: string或QString(如果您使用的是Qt)或CString(如果您使用的是 重新使用MFC / ATL)。

    在稍微不同的音符上,您的字元串会是unicode吗? 大多數字元串類可以透明地處理unicode資料,但是const char不能...

  • 5月前
    5 #

    這取決於 string GetSomeString() { ........ return somestlstring; // can be a local automatic variable } string s = GetSomeString(); 變數已找到。

    如果它是 somestlstring的可變語言環境 功能,那麼這顯然是錯誤的.確實, GetSomeString() 變數在函式末尾销毁,因此 somestlstring 指向不再存在的东西。

    如果它是一个全域性變數,那麼此代碼是正確的。

    const char *

  • caching:jQuery物件:快取還是不快取?
  • sorting:如何在C#中按特定欄位對物件列表进行排序?