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?的主要内容,如果未能解决你的问题,请参考以下文章

如何为在 C 中使用 C++ 代码创建包装器?

分配给设备内存的 CUDA 全局(如 C 语言)动态数组

具有固定长度数组作为参数的 C++ 构造函数[关闭]

用于插入的指针包装器

如何为非托管 c dll 创建 c++\cli 包装器

带有 SWIG 未知长度数组的 NumPy C 扩展