这是一个旧线程,讨论在 MacOS 上进行分析以监视分配。如果您在此过程的同一阶段分配和释放大量不同的指针,可能仍然很难发现泄漏。
您还可以使用类似的东西让您命名指针,并告诉您是否在毁灭之前没有被释放。
@value
@register_passable
struct WrappedPointer[T: AnyRegType, id: String]:
var ptr: Pointer[T]
fn __init__(inout self, size: Int):
self.ptr = Pointer[T].alloc(size)
fn free(owned self) raises:
self.ptr.free()
self.ptr = Pointer[T]()
fn __del__(owned self):
if self.ptr:
print(Self.id, "not freed before delete")
fn __getitem__(self, index: Int) -> T:
return self.ptr[index]
fn __setitem__(inout self, index: Int, value: T):
self.ptr[index] = value
fn load(self) -> T:
return self.ptr.load()
fn store(inout self, value: T):
self.ptr.store(value)
# any other Pointer methods needed
fn leaking_fn():
var ptr = WrappedPointer[Int, "leaking"](10)
ptr[0] = 1
fn freed_fn() raises:
var ptr = WrappedPointer[Int, "freed"](10)
ptr[0] = 2
ptr.free()
fn main() raises:
leaking_fn()
freed_fn()
经过一些工作,也许它可以匹配您实际使用的任何指针类型的签名。或者,如果您没有太多可疑地点,那么这也许已经足够了。