話很少說,看代碼。安全
#include <functional>對象
#ifndef ASSERTit
#include <cassert>io
#define ASSERT assertfunction
#endif模板
/**static
* 釋放對象列表di
* @param items 對象列表sse
* @returncas
*/
template<typename array>
void zero_array(array& items)
{
ASSERT(!items.empty());
if (!items.empty())
{
for (auto iter = items.begin(); iter != items.end();)
{
typename array::value_type& item_ptr = *iter;
destory<typename array::value_type>::delete_data(item_ptr);
iter = items.erase(iter);
}
}
}
/**
* 釋放對象列表
* @param items 對象列表 deleter 刪除器
* @return
*/
template<typename array>
void zero_array(array& items, std::function<void(typename array::value_type&)> deleter)
{
ASSERT(!items.empty());
if (!items.empty())
{
for (auto iter = items.begin(); iter != items.end();)
{
typename array::value_type& item_ptr = *iter;
deleter(item_ptr);
iter = items.erase(iter);
}
}
}
/**
* 刪除器
*/
template<typename T>
struct destory
{ inline static void delete_data(T&) { } };
/**
* 刪除器特化版本
*/
template<typename T>
struct destory <T*>
{ inline static void delete_data(T*& _ptr) { delete _ptr; _ptr = nullptr; } };
代碼很簡單,調用也簡單,好比:
struct tag_a
{
int id;
int age;
};
vector<tag_a*> a_items;
zero_array(a_items);
或者
vector<tag_a> a_items;
zero_array(a_items);
模板內部已經作過類型自動匹配,因此不管是堆類型仍是棧類型均可以安全的刪除。