boost ptr矢量删除一个元素的正确方法

boost ptr矢量删除一个元素的正确方法,boost,ptr-vector,Boost,Ptr Vector,我有一个名为mesh_list的列表 这是一个boost::ptr_向量网格列表 现在我想从中删除一个元素 在mesh对象内部,它有一个我从构造函数中更新的指针,它们是: texture* tex; 现在它是一个普通指针,我必须在从列表中删除网格元素之前删除它吗 如果我将纹理指针更改为shared_ptr,会有什么好处?谢谢boost指针容器始终拥有自己的元素 这意味着他们将始终管理这些元素的删除 指针容器的用途是让您可以拥有运行时多态元素,而不必担心元素的生存期 但是:网格对象包含的指针是/

我有一个名为mesh_list的列表

这是一个boost::ptr_向量网格列表

现在我想从中删除一个元素

在mesh对象内部,它有一个我从构造函数中更新的指针,它们是:

texture* tex;
现在它是一个普通指针,我必须在从列表中删除网格元素之前删除它吗


如果我将纹理指针更改为shared_ptr,会有什么好处?谢谢

boost指针容器始终拥有自己的元素

这意味着他们将始终管理这些元素的删除

指针容器的用途是让您可以拥有运行时多态元素,而不必担心元素的生存期

但是:网格对象包含的指针是/只是/指针,您需要像往常一样释放它

或者

遵循三法则 使用std::unique\u ptr或boost::scoped\u ptr 您可以使用shared_ptr,但这几乎总是过火了——除非您确实想要共享所有权。 下面是一个演示,演示了如何将作用域、唯一和共享的ptr都用于类似的效果,并且纹理*本身会泄漏,除非您为网格类实现三个规则:


添加了不同方法的视觉演示。您可以使用您最喜欢的堆检查器来验证是否没有任何智能指针接近泄漏
#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>

struct texture {
    virtual ~texture() {}
    virtual void foo() const = 0;
};

struct texA : texture { virtual void foo() const { std::cout << __PRETTY_FUNCTION__ << " "; } };
struct texB : texture { virtual void foo() const { std::cout << __PRETTY_FUNCTION__ << " "; } };

template <typename Pointer> void test() {

    struct mesh {
        Pointer _ptr;

        mesh()    : _ptr(new(texA)) {}
        mesh(int) : _ptr(new(texB)) {}

        void bar() const { _ptr->foo(); }
    };

    boost::ptr_vector<mesh> meshes;
    for (int i=0; i<100; ++i) {
        if (rand()%2)
            meshes.push_back(new mesh(i));
        else
            meshes.push_back(new mesh());
    }

    for (auto& m : meshes)
        m.bar();
}

#include <boost/scoped_ptr.hpp>
#include <memory>

int main() {

    //  non-leaking methods
    test<boost::scoped_ptr<texture> >(); // scoped_ptr_mesh
    test<std::unique_ptr<texture> >();   // std_mesh
    test<std::shared_ptr<texture> >();   // shared_mesh

    // uncommenting the next causes textures to be leaked
    // test<texture*>();                    // leaking_mesh
}