【问题标题】:C++ merge 2d arrays (reffed by uniqe_ptr) into 3d arrayC++ 将 2d 数组(由 uniqe_ptr 引用)合并到 3d 数组中
【发布时间】:2013-03-26 13:16:56
【问题描述】:

我需要将三个 2D 数组合并为一个 3D 数组。

我正在使用 unique_ptr 来引用二维数组。

我对智能指针和 C++ 很陌生,所以很可能这是一个明显的错误。

int imgsize = 15;
std::unique_ptr<float[]> redptr(new float[imgsize]);
std::unique_ptr<float[]> greenptr(new float[imgsize]);
std::unique_ptr<float[]> blueptr (new float[imgsize]);

redptr = redChannel._data;
greenptr = greenChannel._data;
blueptr = blueChannel._data;

float * colourArr[3] = {redptr,greenptr,blueptr};

【问题讨论】:

标签: c++ c++11 multidimensional-array unique-ptr


【解决方案1】:

std::unqiue_ptr 背后的想法是std::unique_ptr 拥有指向对象的唯一所有权。构建发布的代码与此前提相矛盾,因为另一个变量现在有一个指向 std::unique_ptr 拥有的对象的指针。发布的代码是危险的,因为它是悬空指针的潜在来源(曾经是 std::unique_ptr超出范围,指向的对象将被破坏,但 colourArr 的元素仍将指向现在已被破坏的对象。

建议使用std::vector&lt;std::vector&lt;float&gt;&gt; 而不是使用std::unique_ptr 并显式动态分配内存。这将管理内存并通过operator[] 提供数组样式访问:

// Construct a vector contain 3 elements,
// where each element is a vector containing 'imgsize' floats.
std::vector<std::vector<float>> colourArr(3, std::vector<float>(imgsize));

【讨论】:

  • 拥有一个指向唯一指针所拥有的对象的指针是很常见的,并且安全地这样做在大多数程序员的掌握之中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2021-05-02
  • 2015-03-06
  • 2012-12-09
相关资源
最近更新 更多