【问题标题】:Cast raw pointer of array to unique_ptr将数组的原始指针转换为 unique_ptr
【发布时间】:2017-07-05 10:24:16
【问题描述】:

我正在使用一个黑盒框架 (cdg),它用值填充 uint32_t 的数组。 调用看起来像这样:

std::size_t dataCount = 100;
uint32_t* data = new uint32_t[dataCount];
cdg.generate(data);

不幸的是,框架不使用模板,所以我必须传入一个uint32_t*。为了摆脱原始指针,我想将它“包装”成std::unique_ptr<uint32_t>。因此它是一个数组,我认为我必须使用 std::unique_ptr<uint32_t[]>。有没有办法将原始指针转换为unique_ptr 或者我应该这样做:

const std::size_t dataCount = 100;
std::unique_ptr<uint32_t[]> data = std::make_unique<uint_32_t[]>(dataCount);
cdg.generate(data.get());

【问题讨论】:

  • 使用std::vectorstd::vector::data()?
  • 为什么不使用 uint32_t 的向量?
  • 如果dataCount 是常量,则使用std::array
  • 你有没有尝试过?
  • @gurka 数组选项是有效的,但只要对要求的一致性有疑问,我就会反对它。

标签: c++ arrays pointers c++14 unique-ptr


【解决方案1】:

智能指针非常棒,但不妨考虑使用std::vector,因为您注意到它是一个数组。

您可以使用 data() 获取指向数据的指针,因为它是 C 数组(用于您的旧接口)。

std::vector<uint32_t> nums(100);   // creates a vector of size 100
uint32_t *ptr = nums.data();
cdg.generate(ptr);                 // passes uint32_t* as needed

如果您需要确保唯一所有权,unique_ptr 是正确的选择。但听起来你真的只是想要一些可以清理数组的东西,但仍然为 C 方法提供原始指针。

【讨论】:

  • 该数组应该由一定数量的“工人”处理。为此,我想“拆分”数组并将其传递给工人: std::size_t workerCount = 10; std::size_t workCount = dataCount / workerCount; for(std::size_t i = 0; i
  • 是的,如data() 文档中所述,表达式data() + offset 是有效的,只要偏移量小于size()
  • std::vector 的数据中的并发工作没有问题,只要您不(重新)移动或追加条目。
  • 是的,当对象超出范围时,vector 的析构函数将以经典的 RAII 方式调用。
  • 也许有人可以补充一点,对于 C++11 之前的 C++ 版本,可以使用 &amp;nums[0] 代替 data()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2021-03-18
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多