假设我有两个指向同一对象的指针。
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 +---------------+ +-------------+
所有访问都是通过智能指针间接进行的,当pointerA
或pointerB
的为"0"时,智能指针可以设置为NULL;释放";。因此,如果释放pointerA
,然后尝试使用pointerB
,则得到的值将为NULL。
这需要一个API来创建和销毁智能指针,获取和设置后端原始指针,等等
例如,(b(GObject是一个使用C中智能指针的部分引用计数变体。它构成了Gtk和GStreamer中对象模型的基础。
早期版本的Windows,在没有内存管理硬件的保护模式之前long(我在那里透露了我的年龄!(使用了类似的双重间接方案,因此它可以随意移动内存,而不会使所有进程都以无效指针结束。