gpt4 book ai didi

c++ - 在一种情况下 shared_ptr 导致运行时错误,在另一种情况下不会

转载 作者:太空狗 更新时间:2023-10-29 19:38:26 24 4
gpt4 key购买 nike

为什么

struct X{};

X x;
X *q = &x;
std::shared_ptr<X> p(&x);

导致错误和

X x;
X *q = &x;
std::shared_ptr<X> p0 = std::make_shared<X>(x);

不会导致运行时错误?

我读到在第一种情况下我有“两个不同的指针,指向相同的数据并且其中一个是共享的”

但是我觉得第二种情况也有同样的情况?

运行时错误

free(): invalid pointer

最佳答案

在第一种情况下,对象 x 被删除,尽管它的生命周期已经在其范围结束时结束。在这里,您在堆栈和范围内创建了一个实例:

X x; // lifetime automatically ends at the end of the scope

然后,您也要求 std::shared_ptr 控制 x 地址的生命周期。

std::shared_ptr<X> p(&x); // calls delete at the end of the scope

因此,您两次释放同一个变量,这是未定义的行为。在第二种情况下,您创建一个 std::shared_ptr 到一个独立于 x 实例的复制实例。

std::shared_ptr<X> p0 = std::make_shared<X>(x); // Copies x, then deletes the copy

这没问题,因为两个对象只被删除一次。

注意这里 std::make_shared 的语义:你传递给它的参数被转发给它的模板参数的构造函数。因此,您触发编译器生成的复制构造函数 X(const X&) 被调用。这与从已存在的指向 via std::shared_ptr p(&x); 的指针创建 std::shared_ptr 非常不同。

关于c++ - 在一种情况下 shared_ptr 导致运行时错误,在另一种情况下不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54999054/

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