我正在用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;
我该如何为这个类编写析构函数? 感谢
答案 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
。