【发布时间】:2021-04-15 05:03:50
【问题描述】:
我认为对此的简短回答是“否”,但假设我有以下功能:
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);
}
}
当然,如果table 已被释放,这将是seg fault。我认为“捕捉”就像在顶部进行空检查一样简单:
// this top part see
if (table == NULL) {
printf("[Empty]");
return;
}
当然,在 C 中没有什么是那么简单的。有没有办法在 C 中进行类似的检查,或者甚至可能是一种 hack-ish 方式来存储结构中的布尔值之类的东西,说明它是否已被“释放” ' 还是不?
作为我现在得到的一个例子:
// 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?
【问题讨论】:
-
使用 c++ 和 unique_ptr ?
-
@OznOg 我不会 C++
-
我想说,只要确保您的指针在不使用时为
NULL。当你初始化它时,除非你立即给它分配一个地址,否则让它指向NULL。释放后,立即使其指向NULL。每当您需要检查它是否指向某个东西时,您可以查看它是否指向NULL。 -
@mediocrevegetable1 我明白了,这是否意味着在“删除”函数中我需要将指针传递给指针结构,而不仅仅是指针结构本身?
-
@carl.hiass 是的,我认为这将是一个好主意,这样您就可以修改指针以指向
NULL。一个例子是void hash_table_delete(hash_table** table_ptr) {free(*hash_table_ptr); *hash_table_ptr = NULL;}根据man page onfree,如果指针是NULL,free不会做任何事情:"如果 ptr 为 NULL,则不执行任何操作。" 因此,您甚至不必对NULL进行任何检查,free会为您完成。当然如果*has_table_ptr是一个无效的地址,会有UB但那是调用者的错
标签: c memory-management