假设我的T
是一个向量typedef std::vector<ofSomething> T;
(它通常是一个大约4-5 MB的向量,重建和存储在数据结构中是很昂贵的)
所以,考虑到:
我必须创建一个载体容器,或者我必须以某种方式将所有这些载体放在一起,我想知道根据RAII哲学的最佳方法是什么。
std::container<T*>
或
std::container<T&>
或
std::container<unique_ptr<T>>
我需要明确地调用析构函数,这看起来并不像RAII那样。
引用它与指针基本相同。
使用智能指针如果我删除或只是“删除”代表智能指针的对象,我会得到我想要的东西。
智能指针的集合对容器容器来说是个好主意吗?我不知道,他们在这里表达所有权而不是自动内存管理,听起来我错误的理念做错了,同时我有多个大容器要处理,直到他们“过期”或他们不再需要了。
你的建议是什么?
答案 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
代替。