c_str的奇怪行为?

Strange behavior of c_str?

本文关键字:str      更新时间:2023-10-16

我有一个下面的代码片段。我预计输出会mystring,但奇怪的是它输出垃圾字符。

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
string s1("mystring");
const char* s2 = s1.c_str();
s1 = "Hi there, this is a changed string s1";
cout << s2 << endl;
return 0;
}

(1( 我最初的想法是c_str负责分配足够的内存 保存s1并返回分配给s2的内存块的地址,从这里开始s1s2独立开始。

(二( 但是当我分配s1 = "Hi there ..... "时,我在(1(中的想法被证明是错误的。不知何故,s1仍然在影响s2.

(三( 当我注释掉s1 = "Hi there .... "行时,一切正常,即mystring打印一致。

(四( 我真的不相信我在 (1( 中的说法,即c_str正在分配内存来容纳s1,因为如果是这种情况,我们将不得不通过指针处理释放内存块s2而我们没有这样做。所以我不确定。

请帮我解释这种奇怪的行为。

引用 cpp 首选项:

c_str()获得的指针可能因以下原因而失效:

  • 在字符串上调用非常量成员函数,不包括运算符 []、at((、front((、back((、begin((、rbegin((、end(( 和 伦德((。

通过修改字符串,您将不再具有有效的指针。

另外,你的前提也是错误的。未分配内存/空闲 w.r.t.c_str.c_strdata(在 C++11 中完全相同(返回指向基础存储的指针。它不拥有存储。当存储因任何原因更改时,您的指针不再有效(即,它现在可能指向垃圾(。

s1.c_str()不返回独立于s1的内存。对s1所做的更改会使s1.c_str()返回的指针失效。

换句话说,小心使用c_str.通常使用它来将 C 字符串传递给不接受C++字符串的函数。

相关文章:
  • 没有找到相关文章