發佈一個stl標準庫容器類(vector/list)的安全刪除方法

話很少說,看代碼。安全

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

模板內部已經作過類型自動匹配,因此不管是堆類型仍是棧類型均可以安全的刪除。

相關文章
相關標籤/搜索