我正在构建一个hashmap类,它可以包含字符串键和不同类型的int,bools,字符串或指针 值 ,我想要它的工作。对于我正在使用它的程序,我创建指针并将其传递给hashmap。当我需要破坏地图时会出现问题。如果hashmap的类型是指针,我需要在删除它的容器之前删除它(值)。
所以我现在的代码是这样的: 我有一个hashNode **抽屉,我用它作为一个二维数组来保存指向地图中hashNodes的指针。这些相同的指针也保存在另一个hashNode **数组中,该数组在将它们添加到map时存储它们(为了增加和复制hashmap的速度/速度)。
template <typename V>
class str_map {
public:
// ...
virtual ~str_map() {
str_map<V>::~str_map();
}
// ....
};
然后我有一堆像这样的方法: 一个常规值:
template <>
str_map<int>::~str_map() {
for(int i=0; i < count && array[i] != NULL; i++){
delete array[i];
}
delete array;
delete drawers;
}
和一个指针:
template <>
str_map<str_map<int>*>::~str_map() {
for(int i=0; i < count && array[i]->val() != NULL; i++)
delete array[i]->val();
for(int i=0; i < count && array[i] != NULL; i++){
delete array[i];
}
delete array;
delete drawers;
}
是否有另一种更好的方法可以正确解构str_map类的实例,以便正确处理所有内存?或者至少是一种使这项工作的方法?
答案 0 :(得分:1)
您的容器应处理值。就是这样,不多也不少。如果有人想要指点,让他们。不要取得他们可能或不指向的所有权。
由哈希映射的用户知道如何管理内存的生命周期。他们应该使用智能指针,所以你的类只是复制它们,智能指针管理内存。
指南管理一个资源,或者根本不管理。如果您正在管理多个资源,那么您已经为失败做好准备。
我怀疑delete array
应为delete [] array;
。这意味着你真的应该使用std::vector
。同样,要么管理一个资源,要么根本不管理。 std::vector
管理一个资源,因此您不必这样做。等等。