我听说Python有自动“垃圾收集”,但C ++没有。那是什么意思?

时间:2009-10-07 08:21:31

标签: c++ python garbage-collection

我听说Python有自动“垃圾收集”,但C ++没有。这是什么意思?

6 个答案:

答案 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

...

垃圾收集使程序员免于手动处理内存分配和释放。因此,某些类别的错误被消除或大幅减少:

  • 悬空指针错误,会发生 当一块内存被释放时 还有指向它的指针,并且 使用其中一个指针。

  • 双重免费错误,发生在 该计划试图释放一个 已经存在的记忆区域 免费。

  • 某些类型的内存泄漏 哪个程序无法解冻 不再引用的内存
    任何变量,随着时间的推移,领先
    记忆疲惫。

...

垃圾收集的基本原则是:

  1. 查找将来无法访问的程序中的数据对象
  2. 回收这些对象使用的资源

答案 3 :(得分:3)

其他人已经回答了主要问题,但我想补充说垃圾收集在C ++中是可行的。它不像Python那样自动化,但它是可行的。

智能指针可能是最简单的C ++垃圾收集形式 - std::auto_ptrboost::scoped_ptrboost::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_ptrboost::shared_array实现引用计数(如Python)。并且有完整的垃圾收集器,旨在取代标准的内存分配器,例如Boehm gc

答案 4 :(得分:2)

它基本上意味着它们处理内存资源的方式。当你需要记忆时,你通常会向操作系统询问它,然后将其还原。

使用python,您无需担心返回它,使用C ++,您需要跟踪您的要求并将其返回,一个更容易,另一个高性能,您选择工具。

答案 5 :(得分:0)

当你得到答案时,现在最好知道自动垃圾收集的缺点: 它需要大量的额外内存,不适合硬实时截止日期应用。