簡體   English   中英

string :: c_str查詢

[英]string::c_str query

通過調用string :: c_str()返回的指針指向何處? 在下面的代碼片段中,我以為我會遇到分段錯誤,但它會為我提供正確的輸出。 如果string :: c_str()返回的指針指向字符串對象內部的內部位置,那么當函數返回並且調用對象析構函數時,我應該獲得無效的內存訪問。

#include <iostream>
#include <string>
using namespace std;

const char* func()
{
    string str("test");
    return str.c_str();
}

int main()
{
    const char* p = func();
    cout << p << endl;
    return 0;
}

Output: test
Compiler: g++ 4.3.3
Platform: ubuntu 2.6.28-19

通過調用string::c_str()返回的指針指向何處?

它指向內存中某個包含std::string內容的以空終止的字符串的位置。

該指針僅在std::string被修改或銷毀之前才有效。 如果再次調用c_str()data() ,它也可能無效。

基本上,最安全的選擇是假設下次您對std::string對象執行操作時,從c_str()獲得的指針無效。

我應該獲得無效的內存訪問權限。

不,您會得到不確定的行為。 您可能會遇到某種內存訪問錯誤(例如分段錯誤),但是您的程序似乎也可以繼續正常運行。 它可能在您一次運行程序時起作用,但下次卻失敗。

您希望將其打印出來嗎?

#include <iostream>
#include <string>

int main()
{
  int* test = new int[20];
  test[15] = 5;
  std::cout << test[15] << "\n";
  delete[] test;
  std::cout << test[15] << "\n";
  return 0;
}

在VS 2010的發布模式下,我得到以下結果:

5
5

當您嘗試訪問已釋放的內存時,不一定會引發異常。 該值也不一定要重寫。 (有趣的是,如果我將編譯方式更改為調試方式,則編譯器將使用-572662307覆蓋該值)。

標准未定義您嘗試訪問它時會發生什么。 這意味着編譯器可以做任何想做的事情,或者選擇什么都不做。 (或者崩潰程序,或者炸毀宇宙……)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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