一般对于 vector/list/set 等中 new出来的数据,在最后都会用 for_each(begin(),end(), ObjectDelete()) 一类的写法进行删除,但对于map中new出来的数据,则没有比较方便的删除方法。写一个类似的 PairDeleter
//使用 for_each 删除容器中保存的对象指针的类(结构) -- 参见 Effective STL 中的条款7 template <typename T> struct ObjecteDeleter { void operator()(const T& ptr) const //通过指针的类型自动实例化一个operator { delete ptr; } }; //空删除标识,一般用于 pair 的 KEY template <typename T> struct NullDeleter { void operator()(const T& /*ptr*/) const { //Do Nothing } }; template < typename KEY, typename VALUE, typename KeyDeleter = NullDeleter<KEY>, typename ValueDeleter = ObjecteDeleter<VALUE> > struct PairDeleter { void operator()(const std::pair<KEY,VALUE>& pa) const { KeyDeleter()(pa.first); ValueDeleter()(pa.second); } };
用法:
void CFTLFunctionalTester::test_PairDeleter() { typedef std::map<int, CMyTestData*> MyTestDataContainer; MyTestDataContainer dataContainer; LONG lOldCount = CMyTestData::GetTestDataCount(); for (int i = 0; i < 5; i++) { dataContainer.insert( std::pair<int,CMyTestData*>( i, new CMyTestData(i))); } CPPUNIT_ASSERT(CMyTestData::GetTestDataCount() - 5 == lOldCount); for_each(dataContainer.begin(), dataContainer.end(), PairDeleter< int,CMyTestData*>()); dataContainer.clear(); CPPUNIT_ASSERT( CMyTestData::GetTestDataCount() == lOldCount); }