仅当值是指针时才调用delete

时间:2012-03-12 13:01:08

标签: c++

我正在创建一个为std :: map添加一些基本操作的类,我希望在从地图中删除项目后自动调用 delete 。但如果第二个(T2)值不是指针,则无法完成。有没有办法检查?

template <class T,class T2>
bool CExtendedMap<T,T2>::remove(T ID)
{
    if(theMap.find(ID)!=theMap.end())
    {
        T2 second = theMap.find(ID)->second;
        theMap.erase(theMap.find(ID));
        //delete second; //Had to comment it out now.
        return true;
    }
    return false;
}

3 个答案:

答案 0 :(得分:8)

使用智能指针,这样您就不必担心删除任何内容了。当您erase地图中的元素时,将释放内存。

答案 1 :(得分:6)

如果我正确理解了您的问题,那么如果您CExtendedMap中存储的配对值是指针或不是指针,您的行为会有所不同。

解决问题的一种简单方法是使用模板重载来获得所需的效果。

实现一个包装器函数,如果参数是指针,将使用delete,如果不是,则执行任何操作,这是迄今为止最简单的解决方案。

下面提供了一个示例实现:

template<class T> inline
void delete_or_nop (T  const&)    {/* NOP */}

template<class T> inline
void delete_or_nop (T* const& p)  {delete p;}

int
main (int argc, char *argv[])
{
  int * p = 0;
  int   n = 0;

  delete_or_nop (p);
  delete_or_nop (n);
}

答案 2 :(得分:0)

    template<class T>
    class Pointer
    {
        private:
       T* pointer;
       int* ref;


    public:
    Pointer():pointer(0), ref(0)
    {
    (*ref)++;

    }

    Pointer(T* value):pointer(value),reference(0)
    {
    (*ref)++;

    }

    Pointer(const pointer<T>& sp):pointer(sp.pointer),ref(sp.ref)
    {
       (*ref)++;
    }

    ~Pointer()
    {
   if(--(*ref)==0)
     {delete pointer;
       delete ref;
     }
    }
    };

有些运营商喜欢 - &gt;,*,=您需要覆盖。