指向数组子集的智能指针(c ++ 11)

时间:2016-05-20 12:34:29

标签: c++ arrays pointers c++11 smart-pointers

我有一个函数作为参数作为双指针:

void myFunction(double **param)

我有时通过传递一个数组调用此函数,其中元素指向另一个数组的特定索引,例如:

double ** mat1 = new double*[2];
mat1[0] = new double[5];
mat1[1] = new double[5];
myFunction(mat1);
...
double **mat2 = new double*[2];
mat2[0] = &mat1[0][2];
mat2[1] = &mat1[1][4];
myFunction(mat2);
...
delete[] mat1[0];
delete[] mat1[1];
delete[] mat1;
delete[] mat2;

我想摆脱代码中的所有“新”运算符,以便利用标准容器或智能指针进行内存管理。但是,我找不到一种方法来更改函数的声明,这样我就可以构建一个数组,其中的元素指向其他数组的子集并将其传递给函数(我需要一个智能指针类型,它只是作为一个常规指针)。

mat1必须与mat2的类型相同(它们都可以作为函数的参数传递),所以我不能使用原始指针的智能指针。

有办法吗?

编辑: 我似乎可以这样做:

std::unique_ptr< std::unique_ptr<double[]>[] > mat2(new std::unique_ptr<double[]>[2]);
mat2[0].reset(&mat1[0][2]);
mat2[1].reset(&mat1[1][4]);

这样做安全吗?我怀疑当mat2被销毁时,&amp; mat1 [0] [2]和&amp; mat1 [1] [4]会有删除?

1 个答案:

答案 0 :(得分:1)

恕我直言,您应该将矩阵封装在专用类中。我会使用一个大致类似的类层次结构:

  • 包含访问函数的公共基类,无论内存位于何处以及如何获取
  • 将分配和释放内存的具体实现(在您的示例中用于mat1)
  • 允许查看主矩阵的具体实现(在您的示例中用于mat2)

通过这种方式,您可以干净地分离分配/解除分配问题,但仍然可以透明地访问原始矩阵及其视图

我不在这里提出代码,因为具体的实现将取决于是否必须通知视图其被破坏(后者更简单......),以及什么是您对公共访问和视图定义的确切要求。

相关问题