【问题标题】:Smart pointer to a subset of an array (c++11)指向数组子集的智能指针 (c++11)
【发布时间】:2016-09-17 17:30:40
【问题描述】:

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

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

【问题讨论】:

  • 为什么所有这些数组都是动态分配的?为什么不是简单的double[2][5]
  • 这是一个示例,但大小和索引通常仅在运行时才知道。
  • 该函数可以取而代之的是一个容器,该容器可以像指针一样使用。在概念出现之前,很难指定,但常规模板参数仍然有效。
  • 为什么不通过使用向量的向量(或其他容器类型)?
  • Jon-> 因为向量包含自己的数据,不能只是对另一个向量的索引的引用。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我可能会这样做。我想做一些更基本的事情来减少开销,但我认为这是我唯一的选择。模板的优点是允许我逐步转换我的代码。
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2021-12-26
  • 2014-11-22
  • 2012-01-10
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多