我有一个返回指向对象的共享指针的函数(由于许多大的依赖关系,很难包含 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
它是作为右值创建的,并在*
运算符运行后立即释放其内存?