使用C ++中的字符串键查找表的内存管理

时间:2015-12-29 01:45:35

标签: c++ string memory-management

我正在用C ++实现一个双键(int和string)查找表,并且想知道我应该如何为它编写析构函数。

查找表API允许用户在表中插入和查找命名对象。在封面下,一个唯一的int键自动分配给保存对象名称的字符串。插入后,可以通过字符串名称或int值查找插入的对象。

以下是实施的要点。

template <class VALUE>
class COLLECTION
{
    public;
    typedef int IDX;
    typedef std::map< std::string , IDX >   NAME_TO_IDX;
    typedef std::map< IDX, std::string >   IDX_TO_NAME;
    typedef std::map<IDX, VALUE*>          IDX_TO_VAL;
...
    void insert( const std::string name, VALUE* v )
    {   
        m_name_to_idx_map[name]       = m_next_idx;
        m_idx_to_name_map[m_next_idx] = name;
        m_idx_to_val_map[m_next_idx] = v;
        ++m_next_idx;
    }
    VALUE* get_value( const IDX idx ) { return m_idx_to_val_map[idx]; }
    VALUE* get_value( const std::string name )
    ....
    private:
    int           m_next_idx;
    NAME_TO_IDX   m_name_to_idx_map;
    IDX_TO_NAME   m_idx_to_name_map;
    IDX_TO_VAL    m_idx_to_val_map;

我该如何为这个类编写析构函数? 感谢

2 个答案:

答案 0 :(得分:0)

唯一堆分配的部分可能是VALUE *(不是大包的巨大粉丝)。 对于析构函数,您必须遍历地图并删除所有相关指针,如下所示

for(auto iter = IDX_TO_VAL.begin(); iter != IDX_TO_VAL.end(); ++iter)
{
    delete (*iter).second;
}

答案 1 :(得分:0)

为了避免在析构函数中编写手动释放所有VALUE*拥有的内存 - 可能你应该使用智能指针。

C ++ 11提供了std::shared_ptr,可用于存储VALUE*

typedef std::map<IDX, std::shared_ptr<VALUE> > IDX_TO_VAL;

如果您可以使用boost库,那么您可以使用boost::shared_ptr