C++破坏了我的想法,如何信任自动垃圾收集器?

Sni*_*irD 4 c++ java memory-management

我主要使用C/C++进行编程,这使我每天处理指针和内存管理.这一天我正在尝试使用其他工具开发,例如Java,Python和Ruby.

问题是我一直在思考C++风格,我编写的代码通常是用几乎所有编程语言编写的C++,而最大的问题是内存管理,我一直在使用Java中的引用编写错误的代码,并且只是像我一样接近可以达到C++风格.

所以我需要2想到这里,一个是信任垃圾收集器,让我们说通过看看基准测试和证明它确实在Java中工作,并知道我应该做什么,以便让我的代码最好的方式.

第二个想法是知道如何编写其他语言代码.我的意思是我知道该怎么做,我只是从来没有像大多数Java或Python程序员那样编写代码,是否有任何C++程序员的书只是为了向我介绍编写约定?(顺便说一句,原谅我的英语错误)

aio*_*obe 7

对于内存使用和常见泄漏具有良好的直觉也是Java中的一件好事.Java中不可能发生内存泄漏是一种常见的误解.

例如,忽略仔细内存管理的人将很快得到大量悬挂GUI组件的树,可以从长期存在的模型中的侦听器列表中获取.(去过也做过.)

继续在结构上编写代码,不要"利用"你可能懒惰的事实.

另一个误解是垃圾收集器"慢".这些算法非常有效,在您分析程序之前不必担心它.一个好的工具是JVisualVM(与JDK捆绑在一起).该工具将向您显示CPU分析,可以帮助您解决可能的内存泄漏并跟踪不必要的小临时分配.


Dav*_*rby 5

需要记住的一个区别是,在C++中,析构函数可用于清理任何类型的资源,而不仅仅是内存(即RAII).在Java中,您必须在try-finally块中显式关闭文件,套接字,数据存储区连接等.如果将资源清理代码放在Java finalize方法中,那么将来可能会在某个不确定的时间调用它,或者从不调用,因此不建议这样做.因此,在某些方面,这会给程序员带来更大的负担,而不是更少.

Python介于两者之间 - 您可以使用'with'语句来处理大多数资源的自动清理.

C++内存管理中的两个问题是内存泄漏并试图使用已经被破坏的对象.正如其他人指出的那样,如果你保留对不再需要的对象的引用,你也可以在Java(和Python)中获得内存泄漏,而这些对象又可能引用其他对象.Java中的内存泄漏可能不那么频繁,但是当它们发生时,它们可能比C++中的大得多.明智地使用弱引用可以提供帮助,并将null赋给不再需要的变量.然而,这导致了第二个问题 - 如果您尝试使用该变量,您将获得NullPointerException.这比你在C++中可能获得的分段错误更有帮助,但仍然是一个问题.

因此,您在C++中学习内存管理的所有知识仍然适用于Java,但您也必须为其他资源执行此操作.