C++ 如何删除boost中的所有元素:应用“a”的多U索引;deleter";

C++ 如何删除boost中的所有元素:应用“a”的多U索引;deleter";,c++,boost,boost-multi-index,C++,Boost,Boost Multi Index,我有一个boost::multi_index_容器,其中包含原始指针(是的,不是最好的主意,但遗憾的是我无法更改它…),我需要删除所有元素以释放内存 有没有办法在boost::multi_index_容器中配置delete functor并调用某种clear方法 提前谢谢。是的。这个想法是使用一个RAII容器,比如一个智能指针 通过这种方式,您可以确保每当删除项时,删除程序都会运行 #include <boost/multi_index_container.hpp> #includ

我有一个boost::multi_index_容器,其中包含原始指针(是的,不是最好的主意,但遗憾的是我无法更改它…),我需要删除所有元素以释放内存

有没有办法在boost::multi_index_容器中配置delete functor并调用某种clear方法


提前谢谢。

是的。这个想法是使用一个RAII容器,比如一个智能指针

通过这种方式,您可以确保每当删除项时,删除程序都会运行

#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";
}
#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";
}

详细说明@Sehe的答案,您可以有一个智能指针隐式接受原始指针,这样用户代码就不需要更改:

#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";
}
#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";
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间boost::multi_索引;
样板
结构隐式\u共享\u ptr:boost::shared\u ptr
{
隐式共享ptr(T*p):boost::共享ptr(p){
};
结构演示{
演示(int-id):id(id){}
int get_id()常量{return id;}
~Demo(){std::cout
>主机集装箱;
int main()
{
{
主机容器测试主机;
insert(新的Demo{42});
}

谢谢你的回答…问题是必须使用原始指针…这是一个我无法更改的旧代码…然后答案是否定的。(怎么可能是旧代码,但问题仍然是新的?)因为原始指针用于代码中的许多点…这些指针存储在一个类似集合的容器中,但现在我需要通过另一个键进行搜索…所以我尝试替换容器…那么,指针的生命周期现在是如何管理的呢?因为
std::set
也没有
erase\u和\u delete
成员oost Intrusive对您来说很有趣……它不是一个std::set,而是一个类似于容器的集合……容器被遍历,指针被删除…-\u-。。。