gpt4 book ai didi

C++:从 *std::shared_ptr 复制时出错

转载 作者:太空狗 更新时间:2023-10-29 23:53:31 25 4
gpt4 key购买 nike

我有一个返回指向对象的共享指针的函数(由于许多大的依赖关系,很难包含 MyObject 定义):

std::shared_ptr<MyObject> f(std::string params)
{
return std::shared_ptr<MyObject>(new MyObject(params));
}

有谁知道这段代码为什么有效:

案例 1:valgrind -v --tool=memcheck 没有错误

std::shared_ptr<MyObject> obj_ptr = f("hello");
MyObject obj = *obj_ptr;

当这段代码崩溃时:

案例 2:崩溃并给出多个错误 valgrind -v --tool=memcheck

MyObject obj = *f("hello");

MyObject 类有一个有效的赋值运算符和复制构造函数(均在案例 1 中验证)。

我也试过创建一个 std::shared_ptr<MyObject> (通过 f ),将其复制到指针,将指针复制到堆栈上的对象,然后删除指针。堆栈上的最终对象仍然很好:

案例 3:valgrind -v --tool=memcheck 没有错误

std::shared_ptr<MyObject> obj_ptr = f("hello");
MyObject * obj_ptr2 = new MyObject(*obj_ptr);
MyObject obj3 = *obj_ptr2;
delete obj_ptr2;
obj3.print();

错误可能是因为std::shared_ptr被创建为右值,并在 * 后立即释放其内存运营商运行?

最佳答案

问题是(几乎可以肯定)您在其复制构造函数中浅复制了 MyObject 的成员之一。然后,您要么尝试访问不再有效的浅层数据,要么将其双重删除。

考虑以下情况:在第一种和第三种情况下,当您对堆栈对象进行操作时,创建所有拷贝的第一个对象仍然存在。在第二种情况下,shared_ptr 在复制构造后消失,调用 MyObject 的析构函数。

如果你这样改变第三种情况,我怀疑它会崩溃:

MyObject * obj_ptr2 = new MyObject("hello");
MyObject obj3 = *obj_ptr2;
delete obj_ptr2;
obj3.print();

关于C++:从 *std::shared_ptr 复制时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524867/

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