如何安全使用ctypes.create_string_buffer?关于.raw属性的拷贝与安全疑问
关于ctypes.create_string_buffer.raw属性的内存安全性问题
在Python中,普通变量赋值只是创建同一对象的引用,不会生成拷贝:
a = b'Hi' b = a a is b # 结果为True
但使用ctypes.create_string_buffer创建缓冲区时,.raw属性的行为完全不同。先看你给出的代码示例:
import ctypes c = ctypes.create_string_buffer(b'Hi') d = c.raw e = c.raw d is e # 结果为False d == e # 结果为True c.raw is c.raw # 结果为False! del c
核心结论
d和e是完全安全可用的。
原因解释
create_string_buffer生成的是一个可变的C风格缓冲区对象(属于ctypes.c_char_Array类型),而.raw属性的实现逻辑是:每次访问时都会从缓冲区内存中读取数据,生成一个全新的不可变bytes对象。这就是为什么多次调用c.raw得到的对象用is判断不相等——它们是独立的对象实例,只是内容完全一致。
当你执行del c时,只是销毁了对原缓冲区对象的引用,原缓冲区的内存会被Python垃圾回收机制处理,但d和e作为已经独立存在的bytes对象,已经持有了原数据的完整拷贝,和原缓冲区没有任何关联,因此不会受到影响,后续可以正常使用。
内容的提问来源于stack exchange,提问作者Mark Ransom
相关产品推荐
相关产品推荐

