析构函数的模板特化

时间:2010-11-10 00:39:06

标签: c++ templates template-specialization

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

1 个答案:

答案 0 :(得分:1)

您的容器应处理。就是这样,不多也不少。如果有人想要指点,让他们。不要取得他们可能或不指向的所有权。

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

指南管理一个资源,或者根本不管理。如果您正在管理多个资源,那么您已经为失败做好准备。

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

相关问题