这个不安全的C ++代码在Python中是否安全?

时间:2017-07-18 13:24:51

标签: python garbage-collection

假设我做了类似的事情:

retVal = MyClass().MyClassFunc()

等效的In C ++将创建一个临时的MyClass实例,一旦MyClassFunc函数返回就会被销毁。

现在,如果MyClassFunc函数返回对MyClass类的某个非静态成员变量的引用,则此代码通常不安全。

我的问题是这段代码在Python中是否安全。

更具体地说,我对以下方面的安全感兴趣:

db = MongoClient(uri).get_database(db_name)

但我当然正在寻找一般答案。

1 个答案:

答案 0 :(得分:3)

简短回答:这是安全的(考虑到你对垃圾收集的担心)。

  

现在,如果MyClassFunc函数返回对MyClass类的某个非静态成员变量的引用,那么此代码通常是不安全的。

我假设您担心自从您在堆栈上分配了MyClass对象后,一旦从该方法返回,它将被删除。

在Python中,概念在堆栈中不存在堆。您分配对象,Python虚拟机应该处理它们 - 只要它们是活动的 - 垃圾收集器不会收集它们。

因此,如果您返回对MyClass对象成员的引用,那么至少该成员仍将处于活动状态。如果该成员是非静态方法,它通常会引用该对象,因此MyClass对象也将存活。

在Python中,垃圾收集是以透明的方式完成的,比如C#等。所以你不必担心内存管理:你可以假设如果你引用一个对象,它总是会活着。

例如,人们有时可以找到以下内容:

getter = {'a': 1, 'b': 4, 'c': 2, 'd': 5}.get

所以这里我们获得了对该词典的get方法的引用。我们不能再引用原始字典,但在内部,.get方法将使字典保持活动状态。