我使用 C++ 有一段时间了,我一直想知道 new
关键字。简而言之,我应该使用它还是不使用它?
- 使用
new
关键字...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
- 没有
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除非指针是
delete
d;并且它应该始终被删除,无论采用哪个控制路径,或者是否抛出异常。
方法2(不使用new
)
- 为堆栈上的对象分配内存(所有局部变量都在其中)堆栈可用的内存通常较少;如果分配的对象过多,则会有堆栈溢出的风险。
- 您以后不需要
删除
它。 - 超出范围时不再分配内存。 (即您不应该
返回
指向堆栈上的对象的指针)
至于使用哪一个;鉴于上述限制,您选择最适合您的方法。
一些简单的案例:
- 如果您不想担心调用
delete
(以及导致 memory leaks 的可能性),则不应使用new
。 - 如果您想从函数中返回指向对象的指针,则必须使用
new
关于c++ - 什么时候应该在 C++ 中使用 new 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655065/