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&lt;T[]&gt;作为删除器,因为它没有像shared_ptr&lt;t[]&gt;这样的。

std::shared_ptr<test> array(new test[3], std::default_delete<test[]>());

【讨论】:

该专业还提供T&amp; operator[](size_t) 访问成员。【参考方案2】:

就向量作为数组包装器而言,如果您使用任何合适的智能指针将向量作为内部对象会怎样?

【讨论】:

如果元素类型不可复制,vector::emplace_back() 和 vector::push_back() 将不起作用。我不知道使用初始化列表进行初始化,但我怀疑这有同样的问题。 是的,你是对的,在这种情况下,我们需要用额外的包装器来包装这些不可复制的东西,这确实有点矫枉过正:)

以上是关于C++11 是不是有动态分配数组的包装器,如 Boost 的 scoped_array?的主要内容,如果未能解决你的问题,请参考以下文章