【问题标题】:C - how can a pointer be checked for the memory having been freed from another pointer? [duplicate]C - 如何检查指针是否已从另一个指针中释放? [复制]
【发布时间】:2020-08-12 01:32:19
【问题描述】:

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

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

此时我知道a == NULL 但b 仍然指向那个已被释放的地址。有没有可能通过b知道内存已经被释放了?

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

【问题讨论】:

  • 我不知道。你这样做的动机是什么?您可以创建一个结构来包含它并添加一个has_been_freed 标志。
  • @ggorlen 我将添加更多信息,以便您了解我为什么不添加更多基础架构。

标签: c pointers segmentation-fault


【解决方案1】:

简短的回答:不。长答案:绝对不是:-)

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

但是操作这些指针的代码不一定是你的代码,所以,如果你将后端指针传递给某个函数来释放它通过你的API,所有的赌注都没有了。此外,它为每次访问增加了额外的间接开销。


(a) 一个简单的例子(没有引用计数)是这样的:

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

所有访问都是通过智能指针间接进行的,当pointerApointerB 中的任一 被“释放”时,可以将其设置为NULL。因此,如果你释放pointerA,然后尝试使用pointerB,你得到的值将是NULL。

这需要一个用于创建和销毁智能指针、获取和设置后端原始指针等的 API。


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

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

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2023-03-11
    • 2011-06-02
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多