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的版本做到了这一点.