话不多说,看代码。

#include <functional>

#ifndef ASSERT

#include <cassert>

#define ASSERT assert

#endif

/**

* 释放对象列表

* @param items 对象列表

* @return

*/

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);

模板内部已经做过类型自动匹配,所以不论是堆类型还是栈类型都可以安全的删除。

最新文章

  1. C#代码中实现两个表(DataTable)的关联查询(JOIN)
  2. XSS之xssprotect(转)
  3. 学习笔记——git
  4. c# CLI托管工程开启调试c++库工程代码
  5. linux下搭建sock5代理
  6. struts2的包和命名空间
  7. LittleTool之批量修改材质
  8. c# 获取某个对象的[公有属性]的名称,类型,值
  9. Segments POJ 3304 直线与线段是否相交
  10. SVN服务搭建
  11. 第八讲:I/O虚拟化
  12. [leetcode-592-Fraction Addition and Subtraction]
  13. java.lang.NoSuchMethodError: com.itextpdf.text.pdf.PdfDiv.setKeepTogether(Z)V
  14. sqlserver中批量导出所有作业或链接脚本
  15. 继承Thread类和实现Runnable接口
  16. Node.js安装和简介
  17. Nodejs 使用log4js日志
  18. Centos 装系统 配置网卡,校准时间
  19. Kafka API: TopicMetadata
  20. rem_taobaofix.js

热门文章

  1. POJ 1325 &amp;amp;&amp;amp; ZOJ 1364--Machine Schedule【二分图 &amp;amp;&amp;amp; 最小点覆盖数】
  2. Thinkphp的 is null 查询条件是什么,以及exp表达式如何使用
  3. css3的新特性选择器-------属性选择器
  4. 51nod1004 n^n的末位数字
  5. c# for 和 foreach
  6. Excel 打开两个单独的页面
  7. CCNP路由实验之十五 NAT(网络地址转换)
  8. theme- 自定义控件属性
  9. [NOI.AC#40]Erlang
  10. [BZOJ2238]Mst 最小生成树+树链剖分/并查集