Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?_C++ - Fatal编程技术网

C++ 如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?

C++ 如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?,c++,C++,如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?如果是这样的话,那么我应该将(p)等同于NULL以防止对象的双重破坏吗 int main() { node* head = new node(1); find (head); //smth delete head; return 0; } void find(node* head) { node* p = head; //smth //maybe

如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?如果是这样的话,那么我应该将(p)等同于NULL以防止对象的双重破坏吗

int main()
{
   node* head = new node(1);
   find (head);
   
   //smth

   delete head;
   return 0;
}

void find(node* head)
{
   node* p = head;
   //smth
   //maybe p = NULL
}

delete ptr
做两件事。首先,它根据指针的类型调用析构函数
ptr
。然后,它将用于对象的存储返回到空闲存储(也称为堆)

在代码中调用delete一次,因此只调用一个析构函数。如果对同一指针(或指针的副本)调用了两次delete,则程序将执行未定义行为(undefined Behavior,UB)

UB可以是一个崩溃,什么都没有发生,或者是陌生人的东西

在某些情况下,可以将运行析构函数与回收内存分离。但前提是你也要把分配和建设分开

char buff[sizeof(X)];
X* px = ::new( static_cast<void*>(&buff) ) X{};
// use px
// manually destroy *px:
px->~X();
charbuff[sizeof(X)];
X*px=::新的(静态施法(&buff))X{};
//使用px
//手动销毁*px:
px->~X();

这是一项高级技术,在您学习了“不要使用原始指针”之类的课程很久之后,不要尝试它。

如果您使用原始
,您将100%负责管理您创建的对象。编译器不会猜测何时需要调用delete。谢谢,我已经调整了我的问题。Mat回答了你的问题,你不需要编写
delete p,因此
p
不会被删除(但
head
会被删除)。事实上,你不应该写
删除p
为了避免双重free.Mat,你的意思是在使用new分配内存时,析构函数只有在我们写delete之后才会被调用吗?谢谢你,Jarod,现在我知道了。