我听说 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_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.
【讨论】:
【参考方案5】:这基本上意味着他们处理内存资源的方式。当您需要内存时,您通常会向操作系统请求它,然后将其返回。
使用 python,您无需担心返回它,使用 C++,您需要跟踪您询问的内容并将其返回,一个更容易,另一个性能,您选择您的工具。
【讨论】:
【参考方案6】:您已经得到答案,现在最好了解自动垃圾收集的缺点: 它需要大量的额外内存,不适合硬实时期限应用程序。
【讨论】:
Python 以其后端处理而闻名...?以上是关于我听说 Python 有自动“垃圾收集”,但 C++ 没有。这意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章