C++ 如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?
如果另一个指针(p)指向分配给另一个指针(head)的类,那么前者(p)会调用析构函数吗?如果是这样的话,那么我应该将(p)等同于NULL以防止对象的双重破坏吗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
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,现在我知道了。