求解python的对象内存释放问题

时间:2022-05-16 00:04:25
python的内存释放,初步了解是系统扫描对象没有引用了就会释放。

我想问以下情况内存是否会被释放,

设有循环双链表 CDLL(CircularDoubleLinkList),cdll的每个节点对象dNode拥有数据,前驱,后继data,prior,nNext(和python关键字重复了),CDLL有头指针CDLL.frist,和一删除最后节点的方法CDLL.DLN(delete last node)

DLN实现如下

def DLN(self):
    self.frist.prior = self.frist.prior.prior
    self.frist.prior.next = self.frist

这时尾节点就被切出CDLL了,那么尾节点会被释放掉吗?

再者,CDLL拥有删除循环双链表的方法CDLL.Destory

那么是不是只要如下实现,就可以了

def Destory(self):
    self.frist = None

这样就可以了吗?

如果可以的话,请由此例子给我详解一下python的内存释放机制。菜鸡就剩七十分了,全给大婶们。

4 个解决方案

#1


赋个空值一般就行了。
或者试试del

#2


你说的是CPython的实现而已,python并没有规定具体的GC的实现,而是由具体的实现而定,CPython是用引用计数(实际上比引用计数复杂), 而如jython又是取决于JVM的实现。  至于你刚才写的这个代码,明显是一个强引用,强引用会给计数器加1,你可以调用sys.getrefcount()来查看某个对象的引用,为了保证你的对象指向能被正常的释放, 你应该使用弱引用(weakref)

#3


a = None 只是将a原来引用的对象的计数减1,并不一定代表就会触发GC
另外Cpython里有个GC模块,你可以看看GC的一些接口。

#4


del应该也是将引用计数减一吧

#1


赋个空值一般就行了。
或者试试del

#2


你说的是CPython的实现而已,python并没有规定具体的GC的实现,而是由具体的实现而定,CPython是用引用计数(实际上比引用计数复杂), 而如jython又是取决于JVM的实现。  至于你刚才写的这个代码,明显是一个强引用,强引用会给计数器加1,你可以调用sys.getrefcount()来查看某个对象的引用,为了保证你的对象指向能被正常的释放, 你应该使用弱引用(weakref)

#3


a = None 只是将a原来引用的对象的计数减1,并不一定代表就会触发GC
另外Cpython里有个GC模块,你可以看看GC的一些接口。

#4


del应该也是将引用计数减一吧