首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++删除指针本身,而不是删除指向数据。

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

Stack Overflow用户
提问于 2011-11-14 20:57:24
回答 7查看 6K关注 0票数 3

我从阅读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,它仍然会耗尽内存(因此我需要删除指针本身)。

如何删除指针?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-14 21:02:56

通常,指针将停止存在于作用域的末尾。

示例:

代码语言:javascript
运行
复制
{
  int *p = NULL;
  // do something with p
} // <-- p will be destroyed here

因此,指针变量被称为具有自动存储持续时间。如果一致执行,则将0NULLnullptr分配给没有指向指定类型的对象的指针变量,这样可以很容易地识别取消引用指针是否安全。此实践与指针的生存期或以前指向的对象(如果有的话)没有直接联系。

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

代码语言: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

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

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

注意,与其存储时间无关,任何变量(包括指针)都占用一定数量的内存。通常,如果同时为太多的对象分配空间,就会耗尽内存。因此,您应该避免实现无限递归、分叉炸弹、内存泄漏或类似的东西。

票数 15
EN

Stack Overflow用户

发布于 2011-11-14 21:03:26

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

  • 只有当指针本身没有自动内存管理时才有必要。也就是说,如果指针本身的存储是用malloc.

new分配的

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

  • 指针占用内存,必须存储在某处才能使用,对吗?

如果我将数十亿个不同的指针声明为NULL,那么

仍然会耗尽内存(因此需要删除指针本身)。

当然,

  • 会耗尽内存,billions * sizeof(void*)。需要删除指针与占用空间无关,everything占用空间(好吧,几乎有一些特殊的优化);您只需要对分配给的内容进行delete

如何删除指针?

  • 是如何分配的?如果它有自动存储,那么当指针超出作用域时,它的内存将被自动释放。如果它是用new分配的,则必须用delete删除它,对于new[]/delete[]new[]也是如此。
票数 7
EN

Stack Overflow用户

发布于 2011-11-14 21:03:33

1)通常,指针位于堆栈上或另一个类的成员上,您不需要担心删除这种指针。

2)是。

3)是的,它们将耗尽内存,您需要释放指针。

4)或者让本地指针超出范围,或者去掉包含它的任何对象。

最后,请注意,原始指针非常不受欢迎。选择合适的容器(如vector ),或在需要时选择适当的智能指针。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8128001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档