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

C++ 这是使用指针的正确方法,还是我必须使用智能指针?,c++,pointers,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()是否会因

如何检查指针的内容是否已删除?如果我像这样使用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->function()而导致访问冲突?当我删除p时,p将发生什么情况?

您正在实现浅层复制,这意味着
delete p
将使您的结构成员
\u p
悬空

您可以实现深度复制,如:-

myClass::myClass(myStruct* p)
{
  //Allocate memory for _p.
  //copy all data from p to _p.
}

如果您尝试执行上述操作,并且无效,那么在此上下文中(正确地)使用智能指针实际上会导致编译器错误。例如,如果您知道结构在任何时候都只能有一个所有者,请使用唯一的\u ptr:

myClass::myClass(std::unique_ptr<myStruct>& p)
{
   _p = p;//_p is a std::unique_ptr<myStruct>
}
然后:

std::shared_ptr p(new MyStruct());

MyClass a(p);//不惜一切代价避免使用智能指针。总是使用常规的C风格指针。什么?不要逃避聪明pointers@self把这个建议告诉赛尔夫…@self这和“不惜一切代价避免使用C风格的指针。始终使用智能指针”一样糟糕。我在这里看到了五个不同的问题。“是否…会导致访问冲突?”->是(希望如此)。“当我删除p时,\ p会发生什么?”->没有。“如何检查指针的内容是否已删除?”->您不能。“我必须使用智能指针吗?”->否。“这是使用指针的正确方法吗?”->如果不删除对象,就可以了。因此,深度复制可以解决问题吗?您能给我举个简单的例子吗?复制意味着
p
\u p
不再相关,因此外部指针的更改不会影响成员指针。如果这是不可取的,智能指针是一个不错的选择。但是为什么我看到很多人建议永远不要使用智能指针呢?是自驾马车吗?
std::unique_ptr<MyStruct> p(new MyStruct());

MyClass a(p); // <-- compiler error, cannot copy a unique_ptr, only move it
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.