首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向数组子集的智能指针(c++11)

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

Stack Overflow用户
提问于 2016-05-20 20:34:29
回答 1查看 371关注 0票数 1

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

代码语言:javascript
复制
void myFunction(double **param)

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

代码语言:javascript
复制
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的类型相同(它们都可以作为函数的参数传递),所以我不能使用原始指针的智能指针。

有没有办法做到这一点?

编辑:看起来我可以这样做:

代码语言:javascript
复制
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和&mat11会被删除吗?

EN

回答 1

Stack Overflow用户

发布于 2016-05-20 21:10:46

IMHO,你应该把你的矩阵封装在专用的类中。我将使用大致如下的类层次结构:

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37346869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档