0

我正在构建一个 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 类的实例,以便正确处理所有内存?或者至少有一种方法可以使这项工作?

4

1 回答 1

1

您的容器应该处理。就是这样,不多也不少。如果有人想插入指针,让他们。不要对他们可能指向或可能不指向的任何东西拥有所有权。

哈希映射的用户知道如何管理他们的内存生命周期。他们应该使用智能指针,所以你的类只是复制它们,智能指针管理内存。

指导方针是管理一种资源,或者根本不管理。如果您管理的资源不止一种,那么您已经为失败做好了准备。

我怀疑delete array应该是delete [] array;。这意味着你真的应该使用std::vector. 同样,要么管理一个资源,要么根本不管理。std::vector管理一个资源,因此您不必这样做。等等。

于 2010-11-10T00:44:10.153 回答