问题描述
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
,那么你将很难处理这样的代码。