我听说 Python 有自动“垃圾收集”,但 C++ 没有。这意味着啥?

Posted

技术标签:

【中文标题】我听说 Python 有自动“垃圾收集”,但 C++ 没有。这意味着啥?【英文标题】:I heard that Python has automated "garbage collection" , but C++ does not. What does that mean?我听说 Python 有自动“垃圾收集”,但 C++ 没有。这意味着什么? 【发布时间】:2009-10-07 08:21:31 【问题描述】:

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

【问题讨论】:

【参考方案1】:

试试reading吧。

【讨论】:

【参考方案2】:

这意味着 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”对象。

【讨论】:

虽然,如果你使用'delete'(不管是什么味道)你是在做C,而不是C++...... 不要迷惑人,你完全错了。 C 中的内存释放通过以下方式完成:“free(ch)” ... @bua - 这是 C++,而不是 C。您将 malloc() 和 free() 一起使用,或者 new 和 delete 一起使用。在 C++ 中更喜欢 new 和 delete,因为它们对于每个对象都是可重载的。 @Tom Leys:我在回答中写了“C++ 中的示例”,Matthieu M. 先生上方的树 cmets 写道,“删除”是 C 而不是 C++。 2 cmets 以上我已回复 MR。 Matthieu,那个 C mem 版本将是“free(ch)”,现在你发送垃圾邮件说这是 C++,而不是 C。主啊,我用 C++ 写过示例,你在哪里发现我写过这是 C ???请在理解中重新学习阅读。 对不起@bua,我实际上是在回复@Matthieu,但正在扩展您的评论。我感到困惑并发布了错误的名称。【参考方案3】:

来自***http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29:

...

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

出现的悬空指针错误 当一块内存被释放时 仍然有指向它的指针,并且 使用了其中一个指针。

双重免费错误,当 该程序试图释放一个 已经存在的内存区域 免费。

某些类型的内存泄漏,在 哪个程序无法释放 不再引用的内存 通过任何变量,领先,随着时间的推移, 到内存耗尽。

...

垃圾回收的基本原理是:

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

【讨论】:

【参考方案4】:

其他人已经回答了主要问题,但我想补充一点,垃圾收集在 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.

【讨论】:

【参考方案5】:

这基本上意味着他们处理内存资源的方式。当您需要内存时,您通常会向操作系统请求它,然后将其返回。

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

【讨论】:

【参考方案6】:

您已经得到答案,现在最好了解自动垃圾收集的缺点: 它需要大量的额外内存,不适合硬实时期限应用程序。

【讨论】:

Python 以其后端处理而闻名...?

以上是关于我听说 Python 有自动“垃圾收集”,但 C++ 没有。这意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

垃圾收集机制

c python扩展导致python脚本由于垃圾收集错误而退出segfault

java垃圾是怎么回收的,回收算法

Kotlin/Native 垃圾收集器如何在 C 中工作?

Java虚拟机浅谈——垃圾收集器与内存分配策略

自动释放池与垃圾收集有啥联系?