提升 ptr 向量擦除一个元素的正确方法
boost ptr vector correct way to erase one element
我有一个名为 mesh_list;
的列表
这是一个boost::ptr_vector<mesh> mesh_list;
现在我想从中删除一个元素。
在网格对象内部它有 1 个我从构造函数中更新的指针,它们是:
texture* tex;
现在它是一个普通指针,我是否必须在从列表中删除网格元素之前将其删除?
如果我将纹理指针更改为shared_ptr,我会得到什么好处?谢谢
boost 指针容器始终 拥有它们的元素。
这意味着他们将始终管理这些元素的删除。
指针容器的目的是让您可以拥有运行时多态元素而无需担心元素的生命周期。
但是: mesh
对象包含的指针/只是/一个指针,您需要一如既往地释放它。
两者都
- 遵循三法则
- 使用
std::unique_ptr
或boost::scoped_ptr<>
- 你可以使用
shared_ptr<>
但这几乎总是矫枉过正 - 除非你真的想分享所有权。
这是一个演示,展示了 scoped_ptr
、unique_ptr
、shared_ptr
如何都可以用于类似的效果,而且 texture*
本身会泄漏 (除非你为 mesh
class):
实施三法则
#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
}
我有一个名为 mesh_list;
这是一个boost::ptr_vector<mesh> mesh_list;
现在我想从中删除一个元素。
在网格对象内部它有 1 个我从构造函数中更新的指针,它们是:
texture* tex;
现在它是一个普通指针,我是否必须在从列表中删除网格元素之前将其删除?
如果我将纹理指针更改为shared_ptr,我会得到什么好处?谢谢
boost 指针容器始终 拥有它们的元素。
这意味着他们将始终管理这些元素的删除。
指针容器的目的是让您可以拥有运行时多态元素而无需担心元素的生命周期。
但是: mesh
对象包含的指针/只是/一个指针,您需要一如既往地释放它。
两者都
- 遵循三法则
- 使用
std::unique_ptr
或boost::scoped_ptr<>
- 你可以使用
shared_ptr<>
但这几乎总是矫枉过正 - 除非你真的想分享所有权。
这是一个演示,展示了 scoped_ptr
、unique_ptr
、shared_ptr
如何都可以用于类似的效果,而且 texture*
本身会泄漏 (除非你为 mesh
class):
#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
}