这是使用指针的正确方法,还是我必须使用智能指针?

时间:2014-12-12 05:32:33

标签: c++ pointers

我如何检查指针的内容是否被删除?如果我像这样使用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会发生什么?

2 个答案:

答案 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.