我使用 C++ 有一段时间了,我一直想知道new
关键词。简单地说,我应该使用它还是不使用它?
- 随着
new
关键词...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
- 如果没有
new
关键词...
MyClass myClass;
myClass.MyField = "Hello world!";
从实现的角度来看,它们似乎并没有那么不同(但我确信它们是不同的)...但是,我的主要语言是 C#,当然第一种方法是我习惯的。
困难似乎在于方法 1 更难与 std C++ 类一起使用。
我应该使用哪种方法?
更新1:
我最近使用了new
关键字为heap记忆(或免费商店)对于超出范围的大数组(即从函数返回)。在我使用堆栈之前,这会导致一半元素在范围之外损坏,切换到堆使用可确保元素完好无损。耶!
更新2:
我的一个朋友最近告诉我有一个简单的使用规则new
关键词;每次你打字new
, type delete
.
Foobar *foobar = new Foobar();
delete foobar; // TODO: Move this to the right place.
这有助于防止内存泄漏,因为您总是必须将删除放在某个地方(即,当您将其剪切并粘贴到析构函数或其他函数时)。
方法1(使用new
)
- 为对象分配内存免费商店(这通常与heap)
- 要求您明确
delete
稍后你的对象。 (如果不删除它,可能会造成内存泄漏)
- 内存保持分配状态,直到您
delete
它。 (即你可以return
您使用创建的对象new
)
- 问题中的例子将内存泄漏除非指针是
delete
d;和它应始终删除,无论采用哪条控制路径,或者是否抛出异常。
方法2(不使用new
)
- 为对象分配内存stack(所有局部变量所在的地方)通常可用于堆栈的内存较少;如果分配太多对象,就有堆栈溢出的风险。
- 你不需要
delete
稍后再说。
- 当内存超出范围时,不再分配内存。 (即你不应该
return
指向堆栈上对象的指针)
至于使用哪一个;考虑到上述限制,您可以选择最适合您的方法。
一些简单的情况:
- 如果您不想担心打电话的问题
delete
,(以及可能导致内存泄漏)你不应该使用new
.
- 如果您想从函数返回指向对象的指针,则必须使用
new
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)