C-如何检查一个指针是否从另一个指针中释放了内存



假设我有两个指向同一对象的指针。

int * a = malloc(sizeof(int));
*a = 5;
int * b = a;
free(a);
a = NULL;

在这一点上,我知道a == NULL但b仍然指向已释放的地址。是否可以通过b知道内存已释放?

场景是,我正在运行单元测试,我希望确保在正确的条件下,在正确的时间释放一些结构,因此我希望避免仅仅为了支持测试而添加基础设施。

简短回答:没有。冗长回答:绝对不是:-(

你可以实现一些技巧,比如使用双间接指针(一个包含指向实际后端数据的指针的分配结构((a(,这基本上就是智能指针在C++中的工作方式,我在之前见过它们在C中实现。这些指针比原始指针复杂得多,因为它们可能需要互斥保护的引用计数,并且所有对的使用都只通过API。

但是,操作这些指针的代码可能不一定是您的代码,因此,如果您将后端指针传递给某个函数,使其在不通过API的情况下释放,则所有的赌注都会被取消。此外,它会为每次访问增加额外的间接开销。


(a(这方面的一个简单例子(无参考计数(如下:

pointerA      +---------------+    +-------------+
>---> | smart pointer | -> | actual data |
pointerB      +---------------+    +-------------+

所有访问都是通过智能指针间接进行的,当pointerApointerB为"0"时,智能指针可以设置为NULL;释放";。因此,如果释放pointerA,然后尝试使用pointerB,则得到的值将为NULL。

这需要一个API来创建和销毁智能指针,获取和设置后端原始指针,等等

例如,

(b(GObject是一个使用C中智能指针的部分引用计数变体。它构成了Gtk和GStreamer中对象模型的基础。

早期版本的Windows,在没有内存管理硬件的保护模式之前long(我在那里透露了我的年龄!(使用了类似的双重间接方案,因此它可以随意移动内存,而不会使所有进程都以无效指针结束。

相关内容

  • 没有找到相关文章

最新更新