我有一个函数,将双指针作为参数:
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]);
这样做安全吗?我怀疑在&mat1[0][2]和&mat1[1][4]当mat2被破坏时?
IMHO,您应该将矩阵封装在专用类中。我会使用一个大致如下的类层次结构:
- 一个公共基类,它包含访问函数,无论内存位于何处以及如何获得
- 分配和释放内存的具体实现(用于示例中的mat1)
- 允许查看主矩阵的具体实现(用于示例中的mat2)
这样,您可以干净地分离分配/解除分配问题,但仍然可以透明地访问原始矩阵及其视图。
我不建议在这里使用代码,因为具体的实现将取决于是否必须通知视图其父已被销毁(后者更简单…),以及您对公共访问和视图定义的确切要求。