微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以检查指针是否被释放/无效?

如何解决可以检查指针是否被释放/无效?

我认为对此的简短回答是“不”,但假设我有以下功能

void print_table(const hash_table *table)
{

    printf("-------------------------- SIZE: %zu / %zu -----------------------\n",table->count,table->size);
    for (int i=0; i < table->size; i++) {
        hash_item *item = table->items[i];
        if (item != NULL && item != &HT_DELETED_ITEM)
            printf("Idx: %d {%s: %s}\n",i,item->key,item->value);

    }
}

当然,如果 seg fault 已被释放,这将是 table。我认为“捕获”就像在顶部进行空检查一样简单:

// this top part see
if (table == NULL) {
    printf("[Empty]");
    return;
}

当然,在 C 中没有什么是那么简单的。有没有办法在 C 中进行类似的检查,或者甚至是一种黑客式的方式来存储可能像布尔值这样的结构体中的东西,说明它是否已被“释放” ' 与否?

作为我现在得到的一个例子:

// first time running in with a valid `table` object
-------------------------- SIZE: 2 / 64 -----------------------
Idx: 10 {Mark: Jones}
Idx: 40 {Ben: Johnson}

// second time after free'd
Segmentation fault: 11 <-- I kNow this,but any way to short-circuit this?

解决方法

这应该通过记录在案的先决条件来处理。如果您编写一个函数,它应该记录调用该函数所需的先决条件,然后调用代码有责任确保满足先决条件。这应该是一个先决条件。

例如,调用free的前提是,传入的指针要么指向malloc(或相关函数)分配的内存,但尚未释放。 free 函数不会尝试检查是否满足此先决条件,因为执行此操作是调用代码的责任。

不要依赖于 NULL 的指针值。这不是一个好习惯,而且当你继续学习更复杂的编程技能时,它会对你不利。虽然使用 NULL 的指针值来指示对象尚未分配或已释放当然是有意义的,但永远不应该不加考虑地使用它,在特别有意义的情况下使用。

主要原因很简单——有时会有两个指向同一个对象的指针。当您调用 NULL 时,您通常无法将 both 设置为 free。如果你习惯于假设一个指针在它不指向已分配的东西时总是 NULL,那么你将很难处理这样的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。