C++删除指针本身而不是删除指向数据

PPT*_*Tim 2 c++ delete-operator

我从阅读parashift.com了解到,在指针上使用delete会释放内存

[16.1] delete p是删除指针p还是指向数据*p?

指向数据.

关键字应该是delete_the_thing_pointed_to_by.当释放C中指针所指向的内存时,会发生同样的英语滥用:free(p)实际上意味着free_the_stuff_pointed_to_by(p).

关于"删除(C++)"的维基文章说"许多程序员事后将指针设置为NULL以最小化编程错误"

是否有必要考虑删除指针本身?

说声明的指针仍然占用内存是否正确?

即如果我要将数十亿个不同的指针声明为NULL,它仍会耗尽内存(因此我需要删除指针本身).

我该如何删除指针?

moo*_*eep 14

通常指针将停止在范围的末尾存在.

例:

{
  int *p = NULL;
  // do something with p
} // <-- p will be destroyed here
Run Code Online (Sandbox Code Playgroud)

因此,指针变量被称为具有自动存储持续时间.如果持续进行,分配0,或者NULL,或者nullptr到一个指针变量并不指向特定类型的对象的优点是可以很容易地认出它是否是安全的,取消引用指针.此实践与指针的生命周期或先前指向的对象(如果有)没有直接关联.


相反,当您有以下代码时:

{
  int *p = new int;
  // do something with p
  //delete p; // <-- the object p points to will not be destroyed unless it's deleted
} // <-- p will be destroyed here
Run Code Online (Sandbox Code Playgroud)

同样,指针变量本身将在范围的末尾被销毁,因为它具有自动存储持续时间.相反,int我们使用new操作符分配的对象(在该示例中指针指向该对象)具有动态存储持续时间.它将继续驻留在内存中,直到delete被调用以释放它.这可能会导致内存泄漏(如果您丢失对指向的对象的任何引用p,如本例所示).


当然,如果指针是由它自己动态创建的,例如,如

{
  int** p = new int*;
  // do something with p
  //delete p; // <-- the object p points to will not be destroyed unless it's deleted
} // <-- p will be destroyed here
Run Code Online (Sandbox Code Playgroud)

...这可能是递归示例的起点.


请注意,有一个称为静态存储持续时间的东西,这意味着变量将存在直到程序结束(例如,全局变量或静态变量).如果您想了解有关此主题的更多信息,请参阅:


请注意,与其存储持续时间无关,任何变量(包括指针)都会占用一定量的内存.通常,如果同时为太多对象分配空间,则内存不足.因此,您应该避免实现诸如无限递归,fork炸弹,内存泄漏等相似的事情.


K-b*_*llo 6

是否有必要考虑删除指针本身?

  • 只有指针本身没有自动内存管理才有必要.也就是说,如果指针本身的存储分配了newmalloc.

说声明的指针仍然占用内存是否正确?

  • 一个指针占用内存,它必须存储在某个地方才能使用,对吧?

如果我要将数十亿个不同的指针声明为NULL,它仍会耗尽内存(因此我需要删除指针本身).

  • 当然会耗尽内存billions * sizeof(void*).需要删除指针与占用空间无关,一切都需要空间(好吧,差不多,有一些特殊的优化); 你只需要delete分配的东西new.

我该如何删除指针?

  • 怎么分配?如果它具有自动存储,那么当指针超出范围时,它的内存将自动释放.如果它被分配,new则必须删除delete,对于new[]/ delete[]malloc/ 同样free.