RAII方法容器容器?

时间:2014-06-21 15:35:28

标签: c++ c++11 vector

假设我的T是一个向量typedef std::vector<ofSomething> T;(它通常是一个大约4-5 MB的向量,重建和存储在数据结构中是很昂贵的)

所以,考虑到:

  • 指针
  • 引用
  • 智能指针

我必须创建一个载体容器,或者我必须以某种方式将所有这些载体放在一起,我想知道根据RAII哲学的最佳方法是什么。

std::container<T*>

std::container<T&>

std::container<unique_ptr<T>>

带指针的

我需要明确地调用析构函数,这看起来并不像RAII那样。

引用它与指针基本相同。

使用智能指针如果我删除或只是“删除”代表智能指针的对象,我会得到我想要的东西。

智能指针的集合对容器容器来说是个好主意吗?我不知道,他们在这里表达所有权而不是自动内存管理,听起来我错误的理念做错了,同时我有多个大容器要处理,直到他们“过期”或他们不再需要了。

你的建议是什么?

2 个答案:

答案 0 :(得分:3)

如果你想要一个矢量矢量,并且你想要RAII,那么答案就是这么简单:

std::vector<std::vector<T>> v;

......没有任何参考或指示。

如果您担心随着外部矢量的增长而移动内部容器,请将其展平:

std::vector<T>

并包装索引,以便i = x*W+y

答案 1 :(得分:2)

正如你所说,使用原始指针你需要做自己的内存管理 - 抓住它。您不能将引用存储在标准容器中,因为没有为引用类型定义分配器,并且您仍然需要以某种方式在堆上分配对象 - 刮擦它。 std::unique_ptr将为您执行内存管理并实际编译 - 这会从您的选择中获胜......

但是std::container<T>呢?这也可以正常工作,手动内存管理没有任何问题。它也将受益于移动语义,因此您无需担心被复制的向量。您还可以避免额外的间接级别。

显然使用std::unique_ptr会限制您对容器的处理方式。如果您需要能够复制它和/或其项目,则需要std::shared_ptr代替。