gpt4 book ai didi

c++ - 标准字符串应该崩溃但不会

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:18 26 4
gpt4 key购买 nike

我有一个类:

class A {
public:
string B;
};

然后是代码:

A a1;
a1.B = "abc";

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

A a2(a1);

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

两个实例的 c_str 都指向同一个地方(据我所知,复制构造函数逐位复制 A,字符串在内部将数据存储在 char* 中,指针也被复制。

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

最佳答案

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

编辑:C++ 标准曾经允许写时复制语义,这将共享指针(并且需要引用计数来配合它),但这从 C 开始是不允许的++11。显然有一些 GCC 版本可以做到这一点。

关于c++ - 标准字符串应该崩溃但不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37349569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com