我正在创建一个为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;
}
答案 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;,*,=您需要覆盖。