以unique_ptr
及其release
方法为例,返回指向托管对象的指针并释放所有权。
有没有办法发布 std::array
的基础数组的所有权?
好的,可以使用std::unique_ptr
代替std::array
,这就是全部。无论如何,后者有一些很好的功能,如size
成员方法,有时很有用。
答案 0 :(得分:9)
有没有办法释放std :: array的底层数组的所有权?
没有。 std::array
只是原始数组的包装器。它可以重新分配,但实际上是数组中所有元素的复制操作。目标数组不指向源数组。
您还应注意,std::array
和std::unique_ptr<type[]>
的不同之处在于,std::array
大小必须在编译时知道std::unique_ptr<type[]>
大小可以设置为运行。所有std::unique_ptr<type[]>
确实包含type * name = new type[some_size]
。
答案 1 :(得分:4)
不,std::array
只是一个原生数组的简单包装器,所以它在堆栈上并且不能释放其内容,除非当内容从堆栈中自动弹出时超出范围
您应该考虑使用std::vector
。因为您已经在堆上处理数组。然后,您可以将std::move
向量转换为另一个向量转移&#34;内容的所有权。例如
another_vec = std::move(old_vec); // now another_vec has the contents
注意如果使用unique_ptr
,您获得的数组是在堆上而不是堆栈中!因此,最好使用std::vector
及其data()
函数。但我不完全确定你的用例。
另一个注意事项在考虑使用std::array
时,另一个不那么明显的事情是该类型是重量级对象,这意味着常规右值优化可能< / em>不能以最佳方式工作,因为移动vector
答案 2 :(得分:1)
«release»std :: array基本上意味着调用析构函数并将内存用于其他内容。
您可以使用标准库中的std :: * :: destroy功能或显式调用析构函数来显式销毁显式构造的std :: array。
这是您通常想要避免的事情,除非您正在实施非常基本的数据结构,而您别无选择。一个用例是,如果您想要控制何时以及如何构造和破坏全局数组而不通过指针间接。
C ++ 17可能会提供新功能 destroy_at, destroy and destroy_n明确地破坏对象。