C++11 是不是有动态分配数组的包装器,如 Boost 的 scoped_array?
Posted
技术标签:
【中文标题】C++11 是不是有动态分配数组的包装器,如 Boost 的 scoped_array?【英文标题】:Does C++11 have wrappers for dynamically-allocated arrays like Boost's scoped_array?C++11 是否有动态分配数组的包装器,如 Boost 的 scoped_array? 【发布时间】:2012-01-27 06:59:12 【问题描述】:我经常需要在 C++ 中处理动态分配的数组,因此依赖 Boost 来处理 scoped_array、shared_array 等。在阅读了Stroustrup's C++11 FAQ 和C++11 Reference Wiki 之后,我找不到合适的替代品来替代C++11 标准提供的这些动态数组包装器。有什么是我忽略的,还是我必须继续依赖 Boost?
【问题讨论】:
【参考方案1】:unique_ptr
有一个特化,比如unique_ptr<T[]>
。
#include <iostream>
#include <memory>
struct test
~test() std::cout << "test::dtor" << std::endl;
;
int main()
std::unique_ptr<test[]> array(new test[3]);
当你运行它时,你会得到这个消息。
test::dtor
test::dtor
test::dtor
如果你想使用shared_ptr
,你应该使用std::default_delete<T[]>
作为删除器,因为它没有像shared_ptr<t[]>
这样的。
std::shared_ptr<test> array(new test[3], std::default_delete<test[]>());
【讨论】:
该专业还提供T& operator[](size_t)
访问成员。【参考方案2】:
就向量作为数组包装器而言,如果您使用任何合适的智能指针将向量作为内部对象会怎样?
【讨论】:
如果元素类型不可复制,vector::emplace_back() 和 vector::push_back() 将不起作用。我不知道使用初始化列表进行初始化,但我怀疑这有同样的问题。 是的,你是对的,在这种情况下,我们需要用额外的包装器来包装这些不可复制的东西,这确实有点矫枉过正:)以上是关于C++11 是不是有动态分配数组的包装器,如 Boost 的 scoped_array?的主要内容,如果未能解决你的问题,请参考以下文章