我如何检查指针的内容是否被删除?如果我像这样使用QPointer:
myClass::myClass(myStruct* p){
_p = p;//_p is a myStruct*
}
myClass::function(){
if(_p) {_p->function();}
}
然后我
myStruct* p = new myStruct();
myClass A(p);
delete p;
p = NULL;
A.function();
最后一个A.function()会调用_p->函数(),从而导致访问冲突吗?当我删除p时,_p会发生什么?
答案 0 :(得分:2)
您正在实施浅拷贝,这意味着delete p
会使您的结构成员_p
悬空。
您可以实施以下深层复制: -
myClass::myClass(myStruct* p)
{
//Allocate memory for _p.
//copy all data from p to _p.
}
答案 1 :(得分:0)
在此上下文(正确)中使用智能指针实际上会导致编译器错误,如果您尝试执行上面所做的操作并且它无效。例如,如果您知道任何时候只应该有一个结构的所有者,请使用unique_ptr:
myClass::myClass(std::unique_ptr<myStruct>& p)
{
_p = p;//_p is a std::unique_ptr<myStruct>
}
然后:
std::unique_ptr<MyStruct> p(new MyStruct());
MyClass a(p); // <-- compiler error, cannot copy a unique_ptr, only move it
注意,您不必担心delete
您的结构,因为智能指针会处理它(只要unique_ptr超出范围)。
但是,如果您想共享结构的所有权,可以使用shared_ptr并将其复制好。然后,再次,您永远不需要手动删除它,因为当所有对象不再引用它时,它将自动删除它自己。
myClass::myClass(std::shared_ptr<myStruct>& p)
{
_p = p;//_p is a std::shared_ptr<myStruct>
}
然后:
std::shared_ptr<MyStruct> p(new MyStruct());
MyClass a(p); // <-- no compiler error, works OK
// no need to call delete! but if you wanted to no longer use `p` anymore, simply do:
p.reset(); // <-- now MyClass is the only owner of MyStruct.