繁体   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