我从阅读parashift.com中了解到,在指针上使用delete可以释放内存
16.1删除p是删除指针p,还是指向数据*p?
指向数据。
关键字应该是delete_the_thing_pointed_to_by。当释放C: free(p)中的指针所指向的内存时,英语也会发生同样的错误,这实际上意味着free_the_stuff_pointed_to_by(p)。
关于“删除(C++)”的wiki文章说,“许多程序员后来将指针设置为NULL,以最小化编程错误”
是否有必要考虑删除指针本身?
说声明的指针仍然占用内存是正确的吗?
也就是说,如果我声明数十亿个不同的指针为NULL,它仍然会耗尽内存(因此我需要删除指针本身)。
如何删除指针?
发布于 2011-11-14 21:02:56
通常,指针将停止存在于作用域的末尾。
示例:
{
int *p = NULL;
// do something with p
} // <-- p will be destroyed here
因此,指针变量被称为具有自动存储持续时间。如果一致执行,则将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
同样,指针变量本身将在作用域结束时被销毁,因为它具有自动存储持续时间。相反,我们使用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
..。这可能是递归示例的起点。
请注意,有一种东西称为静态存储持续时间,这意味着变量将一直存在直到程序结束(例如,全局变量或静态变量)。如果您想阅读有关此主题的更多内容,请参见:
注意,与其存储时间无关,任何变量(包括指针)都占用一定数量的内存。通常,如果同时为太多的对象分配空间,就会耗尽内存。因此,您应该避免实现无限递归、分叉炸弹、内存泄漏或类似的东西。
发布于 2011-11-14 21:03:26
是否有必要考虑删除指针本身?
malloc
.或new
分配的
说声明的指针仍然占用内存是正确的吗?
如果我将数十亿个不同的指针声明为NULL,那么
仍然会耗尽内存(因此需要删除指针本身)。
当然,
billions * sizeof(void*)
。需要删除指针与占用空间无关,everything占用空间(好吧,几乎有一些特殊的优化);您只需要对分配给的内容进行delete
。如何删除指针?
new
分配的,则必须用delete
删除它,对于new[]
/delete[]
和new[]
也是如此。发布于 2011-11-14 21:03:33
1)通常,指针位于堆栈上或另一个类的成员上,您不需要担心删除这种指针。
2)是。
3)是的,它们将耗尽内存,您需要释放指针。
4)或者让本地指针超出范围,或者去掉包含它的任何对象。
最后,请注意,原始指针非常不受欢迎。选择合适的容器(如vector
),或在需要时选择适当的智能指针。
https://stackoverflow.com/questions/8128001
复制相似问题