据我所知,在标准C++中,每当您使用new运算符时,必须在某个时刻使用delete运算符以防止内存泄漏。这是因为C++中没有垃圾回收机制。在.NET中,垃圾回收是自动进行的,因此不需要担心内存管理。我的理解正确吗?谢谢。
据我所知,在标准C++中,每当您使用new运算符时,必须在某个时刻使用delete运算符以防止内存泄漏。这是因为C++中没有垃圾回收机制。在.NET中,垃圾回收是自动进行的,因此不需要担心内存管理。我的理解正确吗?谢谢。
new
时,都必须在某个地方以某种方式调用delete
或其他释放内存的函数(取决于内存分配器等)。delete
调用:
delete
,所有子对象也将自动被delete
。gcnew
进行分配意味着内存由.NET跟踪,因此不会发生泄漏。然而,其他资源,如文件句柄等,不受GC管理。new
和delete
需要成对出现。然而,在C++中有机制完全消除了现代风格代码中显式使用delete
的必要性。new
的频率比在C#中要少得多。这是因为在C#中,你在创建结构、类或数组实例时都使用new
,但在C++中,只有当你想动态管理数据元素时才使用new
。大多数数据在C++中不需要动态管理,因此可以在不使用new
的情况下创建。[换句话说,在C++中,new
的含义与在C#中不同。在C++中,它特指动态分配,而在C#中则用于任何构造。]new
时,返回值应直接交给智能指针。智能指针将确保在适当的时间自动调用delete
。 new 来分配数组。标准库(以及Boost / TR1)提供模板类,为您分配和管理数组。
总之,C ++不使用垃圾收集器,但它具有自己的形式的< strong>自动内存管理。两种方法之间存在微妙的差异,但两种方法都自动释放内存,从而消除了大多数类型的内存泄漏。
C ++创建者Bjarne Stroustrup在回答问题时给出了这些概念的权威演示:我如何处理内存泄漏?
另请参见:
new
并将其替换为dynamic
,那会很有趣。我认为这会更加直观...也许排除稀有的“放置new”用法。 - Brent Bradburnclass Foo {};
int main() {
Foo obj1;
Foo* obj2 = new Foo();
delete obj2;
}
是的,你说得对,在标准C++中(在托管C++或其他变体中则不同),每次使用new后必须使用delete。但在C#、Java和其他垃圾回收语言中,则无需这样做(实际上大多数语言都没有相应的"delete"运算符)。
在C++中没有垃圾回收。
正确。
new
都是未受管控的内存,必须通过 delete
手动释放。C++/CLI 添加了 gcnew
,但这不是 C++ 本身,而是一种语言扩展。 - Pavel Minaev自动垃圾回收非常有用,但仍然可能出现内存泄漏问题,就像这个问题所展示的:
虽然在.NET和Java中已经减少了这种情况,但这并不意味着它可以自动处理不良编码。
因此,在C++中,您需要显式释放您请求的内容,我认为这有时更好,因为您知道发生了什么。我希望在.NET和Java中,垃圾回收器在调试模式下做得更少,以帮助确保人们知道他们正在做什么。
正确,你必须担心C++的垃圾回收。
而且...在.NET上不需要担心垃圾回收。
只有当你有如此密集和长时间的脚本需要优化时,你才需要关注它。
编辑:asveikau和Pavel Minaev的评论都很好,谢谢!我过于概括了信息。
Marshal.AllocHGlobal
等函数。 - Pavel Minaev