我正在建立一个可以将字符串键和整数,布尔值,字符串或不同类型的指针作为其值的hashmap类,并且希望它能正常工作。对于该程序,我将其用于创建指针并将其传递到哈希图中。问题是当我需要破坏地图时。如果哈希图的类型是一个指针,则需要先删除它(值),然后再删除它的容器。

所以我现在拥有的代码如下所示:
我有一个hashNode **抽屉,我将其用作二维数组来保存指向地图中hashNode的指针。这些相同的指针也保存在另一个hashNode **数组中,该数组在将它们添加到地图时将其存储(以方便/快速增长和复制哈希图)。

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

最佳答案

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

由您的哈希映射表的用户来决定如何管理其内存的生存期。它们应该使用智能指针,因此您的类只将它们复制到周围,并且智能指针管理内存。

准则是管理一种资源,或根本不管理。如果您要管理多个资源,那么您就要为失败做好准备。

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

09-30 20:36