什么时候应该在 C 中使用 new 关键字?

新手上路,请多包涵

我使用 C++ 已经有一段时间了,我一直想知道 new 关键字。简单地说,我应该使用它,还是不使用它?

  1. 使用 new 关键字…
     MyClass* myClass = new MyClass();
    myClass->MyField = "Hello world!";

  1. 没有 new 关键字…
     MyClass myClass;
    myClass.MyField = "Hello world!";

从实现的角度来看,它们似乎没有什么不同(但我确信它们是不同的)……但是,我的主要语言是 C#,当然第一种方法是我习惯的。

困难似乎在于方法 1 更难与 std C++ 类一起使用。

我应该使用哪种方法?

更新1:

我最近将 new 关键字用于 内存(或 _空闲存储_)用于超出范围(即从函数返回)的大型数组。在我使用堆栈之前,这会导致一半元素在范围之外损坏,切换到堆使用可确保元素完好无损。耶!

更新 2:

我的一个朋友最近告诉我,使用 new 关键字有一个简单的规则;每次输入 new 时,输入 delete

     Foobar *foobar = new Foobar();
    delete foobar; // TODO: Move this to the right place.

这有助于防止内存泄漏,因为您总是必须将删除放在某处(即,当您将其剪切并粘贴到析构函数或其他位置时)。

原文由 Nick Bolton 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 828
2 个回答

方法一(使用 new

  • 空闲存储 上的对象分配内存(这通常与 相同)
  • 稍后需要您明确地 delete 您的对象。 (如果你不删除它,你可能会造成内存泄漏)
  • 内存一直分配到您 delete 它。 (即您可以 return 您使用创建的对象 new
  • 问题中的示例将 泄漏内存,除非指针是 delete d;并且 应该始终删除 它,无论采用哪个控制路径,或者是否抛出异常。

方法2(不使用 new

  • 堆栈 上的对象分配内存(所有局部变量所在的地方)堆栈可用的内存通常较少;如果你分配了太多的对象,你就有堆栈溢出的风险。
  • 您以后不需要 delete
  • 超出范围时不再分配内存。 (即你不应该 return 指向堆栈上的对象的指针)

至于使用哪一个;鉴于上述限制,您选择最适合您的方法。

一些简单的案例:

  • 如果您不想担心调用 delete (以及导致 内存泄漏 的可能性),则不应使用 new
  • 如果您想从函数返回指向对象的指针,您必须使用 new

原文由 Daniel LeCheminant 发布,翻译遵循 CC BY-SA 2.5 许可协议

C++ 核心指南 R.11 :避免明确使用 newdelete

自从写了这个问题的大多数答案以来,情况发生了很大变化。具体来说,C++ 作为一种语言已经进化,标准库现在更加丰富。为什么这很重要?由于两个因素的结合:

  • 使用 newdelete 具有潜在危险:如果您不遵守非常严格的 delete ‘ing all you’ve assigned when it’,内存可能会泄漏不再使用;并且永远不要 delete 当前未分配的内容。
  • 标准库现在提供封装了 newdelete 调用的 智能指针,因此您不必自己管理空闲存储/堆上的分配。标准库和其他地方的其他容器也是如此。

如链接文档所示,这已演变成 C++ 社区编写更好的 C++ 代码的“核心指南”之一。当然,这条规则也有例外:有人需要编写那些使用 newdelete 的封装类;但那个人很少是你自己。

添加到@DanielSchepler 的有效答案:

原文由 einpoklum 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题