我听说Python有自动“垃圾收集”,但C ++没有。这是什么意思?
答案 0 :(得分:12)
尝试使用reading。
答案 1 :(得分:8)
这意味着python用户不需要清理他动态创建的对象,就像你有义务在C / C ++中那样。
C ++中的示例:
char *ch = new char[100];
ch[0]='a';
ch[1]='b';
//....
// somewhere else in your program you need to release the alocated memory.
delete [] ch;
// use *delete ch;* if you've initialized *ch with new char;
在python中:
def fun():
a=[1, 2] #dynamic allocation
a.append(3)
return a[0]
python单独关注“a”对象。
答案 2 :(得分:4)
来自维基百科http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29:
...
垃圾收集使程序员免于手动处理内存分配和释放。因此,某些类别的错误被消除或大幅减少:
悬空指针错误,会发生 当一块内存被释放时 还有指向它的指针,并且 使用其中一个指针。
双重免费错误,发生在 该计划试图释放一个 已经存在的记忆区域 免费。
某些类型的内存泄漏
哪个程序无法解冻
不再引用的内存
任何变量,随着时间的推移,领先
记忆疲惫。
...
垃圾收集的基本原则是:
答案 3 :(得分:3)
其他人已经回答了主要问题,但我想补充说垃圾收集在C ++中是可行的。它不像Python那样自动化,但它是可行的。
智能指针可能是最简单的C ++垃圾收集形式 - std::auto_ptr
,boost::scoped_ptr
,boost::scoped_array
在被销毁后释放内存。在之前的一个答案中有一个例子,可以改写为:
boost::scoped_array<char> ch(new char[100]);
ch[0] = 'a';
ch[1] = 'b';
// ...
// boost::scoped_array will be destroyed when out of scope, or during unwind
// (i.e. when exception is thrown), releasing the array's memory
还有boost::shared_ptr
,boost::shared_array
实现引用计数(如Python)。并且有完整的垃圾收集器,旨在取代标准的内存分配器,例如Boehm gc
答案 4 :(得分:2)
它基本上意味着它们处理内存资源的方式。当你需要记忆时,你通常会向操作系统询问它,然后将其还原。
使用python,您无需担心返回它,使用C ++,您需要跟踪您的要求并将其返回,一个更容易,另一个高性能,您选择工具。
答案 5 :(得分:0)
当你得到答案时,现在最好知道自动垃圾收集的缺点: 它需要大量的额外内存,不适合硬实时截止日期应用。