std字符串应该崩溃但不会崩溃

Zha*_*dze 4 c++ string memory-leaks memory-management

我有一节课:

class A {
  public:
  string B;
};
Run Code Online (Sandbox Code Playgroud)

然后是一个代码:

A a1;
a1.B = "abc";

printf("%p.\n", a1.B.c_str());

A a2(a1);

printf("%p.\n", a2.B.c_str());
Run Code Online (Sandbox Code Playgroud)

两个实例的c_str引用相同的位置(我理解,复制构造函数逐位复制,字符串在内部将数据存储在char*中,并且指针被复制.

但问题是,为什么这段代码不会崩溃?a1和a2是堆栈变量,当解构它们时,字符串B也将被解构,这些字符串的内部字符*(指向相同的内存位置)是否会被删除两次?是不是双重删除,应该导致崩溃?顺便说一下,我禁用了gcc优化,而valgrind也没有显示任何内容.

Mar*_*som 13

不,指针也不会被复制.复制构造函数std::string创建一个缓冲区并从另一个字符串的缓冲区复制数据.

编辑:用于允许写时复制语义的C++标准,它将共享指针(并且需要引用计数与它一起),但是从C++ 11开始不允许这样做.显然有GCC的版本做到了这一点.