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

标签 c++ pointers reference new-operator keyword

我使用 C++ 有一段时间了,我一直想知道 new 关键字。简而言之,我应该使用它还是不使用它?

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

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

困难似乎在于方法 1 更难用于标准 C++ 类。

我应该使用哪种方法?

更新 1:

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

更新 2:

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

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

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

最佳答案

方法一(使用new)

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

方法2(不使用new)

  • 堆栈上的对象分配内存(所有局部变量都在其中)堆栈可用的内存通常较少;如果分配的对象过多,则会有堆栈溢出的风险。
  • 您以后不需要删除它。
  • 超出范围时不再分配内存。 (即您不应该返回指向堆栈上的对象的指针)

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

一些简单的案例:

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

关于c++ - 什么时候应该在 C++ 中使用 new 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655065/

相关文章:

c++ - 分配给引用参数会使对象无效

ios - 将对象的Obj-C设置值作为参数发送

pointers - 如何递归传递可变引用?

c++ - 使用指向数组的指针遍历对象数组

c++ - 防止 C++(或 C++0x)中的 header 爆炸

c++ - 传递给函数时如何使结构为空?

reference - Ionic 2 Cordova网络信息插件引用错误

在 -std=c++11 上编译时的 C++ "no match for operator >>"

c++ - Googlemock:如何验证对象数组中的元素?

c++ - Poco ODBC 和 while SQL 循环