强制解除分配对象
即使在 Python 2 和 3 中它们的引用数不为 0,也可以强制释放对象。
两个版本都使用 ctypes
模块来执行此操作。
警告: 这样做会使 Python 环境不稳定,并且在没有回溯的情况下容易崩溃! 使用此方法也可能会引入安全问题(非常不可能)只有释放你确定永远不会再次引用的对象。永远。
Python 3.x >= 3.0
import ctypes
deallocated = 12345
ctypes.pythonapi._Py_Dealloc(ctypes.py_object(deallocated))
Python 2.x >= 2.3
import ctypes, sys
deallocated = 12345
(ctypes.c_char * sys.getsizeof(deallocated)).from_address(id(deallocated))[:4] = '\x00' * 4
运行后,对现在解除分配的对象的任何引用都将导致 Python 产生未定义的行为或崩溃 - 没有回溯。垃圾收集器可能没有删除该对象的原因…
如果你取消分配 None
,你会在崩溃之前收到一条特殊信息 - Fatal Python error: deallocating None
。