在 clear() 之前释放容器内的指针

free'ing pointers inside a container before clear()

我有这样一个容器:

std::unordered_set<char*, Hash, Equal> my_set;

我想在 .clear() 之前释放容器内的 char*,所以我这样做了,

for(auto i : my_set){
    free(i);
}
my_set.clear();

但这意味着,在 .clear() 之前,容器已损坏。我倾向于认为这是正常的,因为我无论如何都要清除它。但我应该知道这是未定义的行为,还是可以使用?

But this means, before the .clear(), the container is corrupted.

容器没有损坏。它存储 char*s,可以将其视为可以存储文本的数字地址。如果这些地址不再存储有效文本,只要不尝试 follow/dereference 访问该内存的指针就完全没问题。 unordered_map<char*>char* 视为 values/numbers 并且实际上没有意识到它们可能指向任何东西 - 即使容器是 resized/rehashed 它也永远不会取消引用指针。无论如何,容器永远不会调整大小,除非您进行更多跨越 max_load_factor().

的插入

它的意思是您暂时拥有了一个装满悬挂指针的容器。这不是未定义的行为 - 它完全没问题,就像这样一样:

{
    char* p = strdup("boo");
    free(p);
}

在那里,p 是 free() 之后的悬垂指针,但由于作用域存在,所以没有发生任何令人讨厌的事情 - 对于 char*,运行 没有 hidden/implicit 析构函数对象。

也就是说,最好使用 RAII 语义 - 一种包装 char* 的类型,它将在析构函数中释放它:this answer 展示了一种使用 [=19= 来实现的方法].