提高ptr向量的正确方法来擦除一个元素

用户名

我有一个清单叫做 mesh_list;

这是一个 boost::ptr_vector<mesh> mesh_list;

现在我要从中删除一个元素。

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

texture* tex;

现在它是一个普通的指针,在从列表中删除网格元素之前是否必须删除它?

如果将纹理指针更改为shared_ptr,该怎么办?谢谢

Boost指针容器始终拥有其元素。

这意味着他们将始终设法删除这些元素。

指针容器的目的是使您可以拥有运行时多态元素,不必担心元素的生存期。

但是mesh对象所包含的指针是/ just /指针,您需要像往常一样释放它。

任何一个

  • 遵循三法则
  • 使用std::unique_ptrboost::scoped_ptr<>
  • 您可以使用,shared_ptr<>但这几乎总是矫over过正-除非您实际上想共享所有权。

下面是一个示范,说明如何scoped_ptrunique_ptrshared_ptr都是可以用来类似的效果,而且texture*意志,本身泄漏(除非您实现对规则的三大mesh类):

Live On Coliru

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

给定一个向量,擦除低于 itemsnum 的元素

来自分类Dev

vector :: erase不会擦除期望的元素,而是擦除了向量中的最后一个元素

来自分类Dev

有什么更好的方法来检索另一个元素?

来自分类Dev

Java 创建一个方法来读取和洗牌现有数组的元素

来自分类Dev

在AngularJS中寻找一种更好的方法来遍历并一次显示一个元素

来自分类Dev

创建一个方法来设置对象的数据

来自分类Dev

一种快速的方法来检查两组是否至少包含一个相同的元素

来自分类Dev

需要一种方法来从许多相同元素中的一个获取属性

来自分类Dev

更直观的方法来填充对角线向量右侧的三个元素

来自分类Dev

仅写入 c++ stl 向量的第一个元素的正确方法

来自分类Dev

有没有更快的方法来创建一个空数组的元素数组而不使用for循环

来自分类Dev

如何通过一个类和方法来创建一个类的实例?

来自分类Dev

如何将向量的每个元素的幂提高到另一个向量的每个元素的幂?

来自分类Dev

如何创建一个向量来指示一个向量的元素与另一个向量中的任何元素之间的匹配?

来自分类Dev

如何创建一个向量来指示一个向量的元素与另一个向量中的任何元素之间的匹配?

来自分类Dev

有没有一种快速的方法来获取放置在数组中的最后一个元素?

来自分类Dev

有没有一种优雅的方法来检查数组中的哪些元素在另一个容器中?

来自分类Dev

必须有一个更好的方法来解析两个文件

来自分类Dev

正确的方法来构建python可执行文件(在wxWidgets中),以便可以从另一个wxWidgets应用程序中调用它?

来自分类Dev

创建一个通用方法来组合多个.close()连接方法

来自分类Dev

java创建一个类的方法来调用另一个类的方法

来自分类Dev

如何编写一个通用的isEmpty方法来检查null,empty?

来自分类Dev

优雅的方法来检查元组中的任何一个值是否为零

来自分类Dev

如何定义一个泛型方法来返回派生类类型的实例?

来自分类Dev

最简单的方法来“存储”一个类上的函数而不绑定它?

来自分类Dev

Laravel 5简单的方法来获得一个selected选择的记录的ID

来自分类Dev

Java程序-编写一个程序,使用称为circleArea的方法来计算圆的面积

来自分类Dev

创建一个方法来反转数组String [],然后检查它是否是回文

来自分类Dev

C#最好的方法来检查一个值在列表中存在几次

Related 相关文章

  1. 1

    给定一个向量,擦除低于 itemsnum 的元素

  2. 2

    vector :: erase不会擦除期望的元素,而是擦除了向量中的最后一个元素

  3. 3

    有什么更好的方法来检索另一个元素?

  4. 4

    Java 创建一个方法来读取和洗牌现有数组的元素

  5. 5

    在AngularJS中寻找一种更好的方法来遍历并一次显示一个元素

  6. 6

    创建一个方法来设置对象的数据

  7. 7

    一种快速的方法来检查两组是否至少包含一个相同的元素

  8. 8

    需要一种方法来从许多相同元素中的一个获取属性

  9. 9

    更直观的方法来填充对角线向量右侧的三个元素

  10. 10

    仅写入 c++ stl 向量的第一个元素的正确方法

  11. 11

    有没有更快的方法来创建一个空数组的元素数组而不使用for循环

  12. 12

    如何通过一个类和方法来创建一个类的实例?

  13. 13

    如何将向量的每个元素的幂提高到另一个向量的每个元素的幂?

  14. 14

    如何创建一个向量来指示一个向量的元素与另一个向量中的任何元素之间的匹配?

  15. 15

    如何创建一个向量来指示一个向量的元素与另一个向量中的任何元素之间的匹配?

  16. 16

    有没有一种快速的方法来获取放置在数组中的最后一个元素?

  17. 17

    有没有一种优雅的方法来检查数组中的哪些元素在另一个容器中?

  18. 18

    必须有一个更好的方法来解析两个文件

  19. 19

    正确的方法来构建python可执行文件(在wxWidgets中),以便可以从另一个wxWidgets应用程序中调用它?

  20. 20

    创建一个通用方法来组合多个.close()连接方法

  21. 21

    java创建一个类的方法来调用另一个类的方法

  22. 22

    如何编写一个通用的isEmpty方法来检查null,empty?

  23. 23

    优雅的方法来检查元组中的任何一个值是否为零

  24. 24

    如何定义一个泛型方法来返回派生类类型的实例?

  25. 25

    最简单的方法来“存储”一个类上的函数而不绑定它?

  26. 26

    Laravel 5简单的方法来获得一个selected选择的记录的ID

  27. 27

    Java程序-编写一个程序,使用称为circleArea的方法来计算圆的面积

  28. 28

    创建一个方法来反转数组String [],然后检查它是否是回文

  29. 29

    C#最好的方法来检查一个值在列表中存在几次

热门标签

归档