在 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= 来实现的方法].
我有这样一个容器:
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= 来实现的方法].