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

标签 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;

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

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被销毁时,&mat1[0][2]和&mat1[1][4]会被删除?

最佳答案

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

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

这样您就可以清楚地分离分配/解除分配问题,但仍然可以透明地访问原始矩阵及其 View

我不建议在这里编写代码,因为具体的实现将取决于是否必须通知 View 它的parent 已被销毁而不是(后者更简单...),以及取决于什么是您对通用访问和查看定义的确切要求。

关于c++ - 指向数组子集的智能指针 (c++11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37346869/

相关文章:

c++ - 如何包含字符串标题?

c - 将结构数组分配给指针

带有特殊字符短划线 (-) 和下划线 (_) 的 Javascript 自定义排序

c - 从C中的函数获取返回值

c++ - 为什么 lambda 参数中不允许使用 auto?

c++ - SDL 插件库未正确链接

c++ - 使用共享指针双重删除,即使对象仍然有一个 shared_ptr,它的析构函数正在被调用

javascript - Unity javascript 中的 Foreach 等效函数

C++指针类

c - 如何使用 malloc() 分配内存来存储字符串数组?