通常,指针将停止存在于作用域的末尾。
示例:
代码语言:javascript复制{
int *p = NULL;
// do something with p
} // <-- p will be destroyed here因此,指针变量被称为具有自动存储持续时间。如果一致执行,则将0、NULL或nullptr分配给没有指向指定类型的对象的指针变量,这样可以很容易地识别取消引用指针是否安全。此实践与指针的生存期或以前指向的对象(如果有的话)没有直接联系。
相反,当您有以下代码时:
代码语言:javascript复制{
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同样,指针变量本身将在作用域结束时被销毁,因为它具有自动存储持续时间。相反,我们使用int操作符分配的new对象(本例中指针指向的对象)具有动态存储持续时间。它将继续驻留在内存中,直到调用delete来释放它。这可能导致内存泄漏(如果您丢失了指向的对象p的任何引用,如本例所示)。
当然,如果指针是由自己动态创建的,例如
代码语言:javascript复制{
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..。这可能是递归示例的起点。
请注意,有一种东西称为静态存储持续时间,这意味着变量将一直存在直到程序结束(例如,全局变量或静态变量)。如果您想阅读有关此主题的更多内容,请参见:
http://en.cppreference.com/w/cpp/language/storage_durationhttp://en.cppreference.com/w/cpp/language/static
注意,与其存储时间无关,任何变量(包括指针)都占用一定数量的内存。通常,如果同时为太多的对象分配空间,就会耗尽内存。因此,您应该避免实现无限递归、分叉炸弹、内存泄漏或类似的东西。