use*_*ser 2 c++ valgrind shared-ptr c++11
我有一个函数返回一个指向对象的共享指针(由于许多大的依赖项,很难包含MyObject定义):
std::shared_ptr<MyObject> f(std::string params)
{
return std::shared_ptr<MyObject>(new MyObject(params));
}
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么这段代码有效:
案例1:没有错误 valgrind -v --tool=memcheck
std::shared_ptr<MyObject> obj_ptr = f("hello");
MyObject obj = *obj_ptr;
Run Code Online (Sandbox Code Playgroud)
虽然此代码崩溃:
案例2:崩溃并给出了几个错误 valgrind -v --tool=memcheck
MyObject obj = *f("hello");
Run Code Online (Sandbox Code Playgroud)
MyObject类有一个工作赋值运算符和复制构造函数(在案例1中都经过验证).
我还尝试创建一个std::shared_ptr<MyObject>(via 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();
Run Code Online (Sandbox Code Playgroud)
错误可能是因为std::shared_ptr创建为右值,并在*运算符运行后立即释放其内存?
问题是(几乎可以肯定)你正在复制MyObject其复制构造函数中的一个成员.然后,您要么尝试访问不再有效的浅层数据,要么双重删除它.
考虑这些情况:在第一种和第三种情况下,当您对堆栈对象进行操作时,制作所有副本的第一个对象仍然存在.在第二种情况下,shared_ptr在复制构造之后消失,调用析构函数MyObject.
如果你这样改变了第三种情况,我怀疑它会崩溃:
MyObject * obj_ptr2 = new MyObject("hello");
MyObject obj3 = *obj_ptr2;
delete obj_ptr2;
obj3.print();
Run Code Online (Sandbox Code Playgroud)