在C++中,处理内存分配/删除的任何一般准则?

JnB*_*ymn 4 c++ memory pointers memory-management

可能我所要求的只是一个链接到我尚未找到的网站.但是来自Java背景,在C++中处理内存分配和删除的一般原则是什么?我觉得我可能会在我的应用程序中添加各种内存泄漏.我意识到有几种智能指针的变种,你也可以提到它我,但我想专注于标准的C++指针.

jco*_*der 17

我通常的政策就是这样

  • 使用智能指针,其中使用情况非常复杂.
  • 所有原始指针都由负责删除它的特定对象拥有.
  • 如果要稍后设置,构造函数总是分配指针或将其初始化为null.
  • 析构函数总是删除任何包含的指针
  • 这些规则确保在删除其拥有对象时删除指针,从而消除最常见的内存泄漏情况.
  • 永远不要将内部指针传递给另一个对象,始终传递容器对象并使容器对象的被调用函数调用成员函数作用于"指针".
  • 禁用复制容器对象.在极少数情况下,实现副本以便复制指向的对象.但是,永远不要在没有复制包含对象的情况下复制拥有对象.
  • 前两个规则确保您不能拥有指向已删除内存的指针副本.
  • 不要尝试实现引用计数.如果需要引用计数指针,请使用智能指针类并包含该指针.

我发现这些规则通常可以确保您可以安全有效地使用原始指针,如果您想要破坏这些规则,那么请使用智能指针.

  • 有时,您不需要使用指针作为成员做任何特殊操作.想想迭代器.所以,它实际上取决于你想要的语义.删除迭代器析构函数中的对象是个坏主意.;-) (2认同)

ere*_*eOn 5

通常,我们使用new分配内存并delete释放它.(主要是因为new调用适当的构造函数和delete适当的析构函数).

但是这里的大多数人会建议你不要使用原始指针而不是用于教育目的(除非智能指针的开销很大,比如嵌入式编程).

了解工作是很重要的,但在大多数情况下,您可以利用设计良好的智能指针类来使您更轻松(并且通常更安全).

智能指针的存在有一个原因:帮助程序员完成优秀的程序,而不必过多关注处理分配/释放.

  • @C约翰逊:很高兴我让你发笑:)要注意详细说明你觉得有趣吗?!:) (3认同)

C J*_*son 5

使用极端偏执的指针.对于在类中声明的每个成员变量,记录它是否拥有它指向的内存的内存生存期.如果是,那么它负责分配和释放内存.如果它确实拥有它指向的内存,请将其清楚地记录下来!还记得,在构造函数中分配并在析构函数中释放.这是一个很好的规则,你忽略了你的危险.除了你使用它们之外,你的指针也是空的.初始化时将它们清空,然后释放它们.在解除引用它们之前,将大量断言放在检查指针完整性的地方.放入真正的警卫来处理他们不好的情况.

最后也是最重要的:

消防贵公司任何滥用这些政策的bozo!它们确实会给您的产品注入无数的伤害,并在路上造成大量的虫子和头痛.

编辑: 链接收藏的c ++网站