如何擦除boost中的所有元素:multi_index应用"删除"

时间:2015-03-02 10:54:29

标签: c++ boost boost-multi-index

我有一个带有原始指针的boost :: multi_index_container (是的,不是最好的主意,但遗憾的是我无法改变它......)我需要删除所有释放内存的元素。 ..

有没有办法在boost :: multi_index_container中配置删除仿函数并调用某种清晰的方法?

提前致谢。

2 个答案:

答案 0 :(得分:0)

是。我们的想法是使用RAII容器,就像智能​​指针一样。

通过这种方式,您可以确保在删除项目时运行删除器。

<强> Live Coliru Demo

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <iostream>

using namespace boost::multi_index;

struct Demo {
    Demo(int id) : id(id) {}
    int get_id() const { return id; }

    ~Demo() { std::cout << "some kind of deleter runs :)\n"; }
    private:
    int id;
};

typedef multi_index_container<boost::shared_ptr<Demo>,
        indexed_by<
            hashed_unique<const_mem_fun<Demo, int, &Demo::get_id>>>
        > HostContainer;

int main()
{
    {
        HostContainer testHosts;
        testHosts.insert(boost::make_shared<Demo>(42));
    }

    std::cout << "done\n";
}

打印

some kind of deleter runs :)
done

答案 1 :(得分:0)

阐述@ Sehe的答案,您可以拥有一个隐式接受原始指针的智能指针,以便用户代码无需更改:

<强> Live Coliru Demo

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <iostream>

using namespace boost::multi_index;

template<typename T>
struct implicit_shared_ptr:boost::shared_ptr<T>
{
  implicit_shared_ptr(T* p):boost::shared_ptr<T>(p){}
};

struct Demo {
    Demo(int id) : id(id) {}
    int get_id() const { return id; }

    ~Demo() { std::cout << "some kind of deleter runs :)\n"; }
    private:
    int id;
};

typedef multi_index_container<
        implicit_shared_ptr<Demo>,
        indexed_by<
            hashed_unique<const_mem_fun<Demo, int, &Demo::get_id>>>
        > HostContainer;

int main()
{
    {
        HostContainer testHosts;
        testHosts.insert(new Demo{42});
    }

    std::cout << "done\n";
}