我想问以下情况内存是否会被释放,
设有循环双链表 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
或者试试del
#2
你说的是CPython的实现而已,python并没有规定具体的GC的实现,而是由具体的实现而定,CPython是用引用计数(实际上比引用计数复杂), 而如jython又是取决于JVM的实现。 至于你刚才写的这个代码,明显是一个强引用,强引用会给计数器加1,你可以调用sys.getrefcount()来查看某个对象的引用,为了保证你的对象指向能被正常的释放, 你应该使用弱引用(weakref)
#3
a = None 只是将a原来引用的对象的计数减1,并不一定代表就会触发GC
另外Cpython里有个GC模块,你可以看看GC的一些接口。
另外Cpython里有个GC模块,你可以看看GC的一些接口。
#4
del应该也是将引用计数减一吧
#1
赋个空值一般就行了。
或者试试del
或者试试del
#2
你说的是CPython的实现而已,python并没有规定具体的GC的实现,而是由具体的实现而定,CPython是用引用计数(实际上比引用计数复杂), 而如jython又是取决于JVM的实现。 至于你刚才写的这个代码,明显是一个强引用,强引用会给计数器加1,你可以调用sys.getrefcount()来查看某个对象的引用,为了保证你的对象指向能被正常的释放, 你应该使用弱引用(weakref)
#3
a = None 只是将a原来引用的对象的计数减1,并不一定代表就会触发GC
另外Cpython里有个GC模块,你可以看看GC的一些接口。
另外Cpython里有个GC模块,你可以看看GC的一些接口。
#4
del应该也是将引用计数减一吧