发布一个stl标准库容器类(vector/list)的安全删除方法

话不多说,看代码。

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

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

转载于:https://www.cnblogs.com/ilook/p/4534855.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值