向函数传递智能指针
Passing smart pointers to a function
我有一个双精度的二维智能指针数组。我可以为它赋值并显示它,但我在将它传递给以双**作为输入的函数时遇到了问题。简单的get()不起作用。
#include <iostream>
#include <memory>
using namespace std;
# define DIM1 3
# define DIM2 4
void funcCall(double** item)
{
cout<< "Test function.";
}
int main() {
std::unique_ptr<std::unique_ptr<double[]>> myArray(new std::unique_ptr<double[]>[DIM1]);
for (int i = 0; i < DIM1; i++)
{
myArray.get()[i].reset(new double[DIM2]);
}
std::cout<<"Assign values"<<std::endl;
for (int i = 0; i < DIM2; i++)
{
for (int j = 0; j < DIM1; j++)
{
myArray.get()[j][i] = (j+1)*(i+1);
}
}
funcCall(myArray.get());
return 0;
}
当我编译这个时,我得到:
error: cannot convert 'std::unique_ptr<std::unique_ptr<double []> >::pointer {aka std::unique_ptr<double []>*}' to 'double**' for argument '1' to 'void funcCall(double**)' funcCall(myArray.get())
void funcCall(std::unique_ptr<std::unique_ptr<double[]>> & arr)
应该做你想做的事,但是。。。
但是
听起来你想重新发明轮子。不要那样做。除非这是为了一项任务或个人教育,否则就疯了。
相反,请使用其中一个内置容器。
因为DIM1
和DIM2
是常数,所以可以使用
std::array<std::array<double, DIM2>,DIM1> myArray;
和
void funcCall(std::array<std::array<double, DIM2>,DIM1> arr)
但如果你想要一个动态的解决方案,可能性是相当大的。在这种情况下,请尝试
std::vector<std::vector<double>> myArray(DIM1, std::vector<double>(DIM2));
和
void funcCall(std::vector<std::vector<double>> arr)
但是
老实说,这是一个愚蠢的赌注。阵列阵列或矢量矢量在内存中不连续,因此计算机必须在存储中跳跃,在不必要的缓存未命中上浪费时间,并且加载和可能重新加载缓存所花费的时间通常比所涉及的计算更长。在这一点上,世界上所有的133t数学都无法帮助你,因为你已经被IO门控了,而IO就是sssssssslllloooowwwwwwwwww。
你真正想要的是一个很好的一维数组,它是手动索引的。行*列数+列。当然,手动索引看起来像是额外的工作,但停下来想想:编译器在后台做了多少数学运算才能让数组工作,嗯?可能差不多。你就是看不到它。
让我们暂时使用std::vector,但这同样适用于std::array,甚至是一个好的ol'静态数组或智能指针内的动态数组。
std::vector<double> myArray(DIM1*DIM2);
使用这个相对简单:
myArray[row*DIM2 + column];
功能是:
void funcCall(std::vector<double> arr)
但这很容易封装在一个类中,并进一步简化:
class matrix
{
private:
std::vector<double> myArray;
size_t nrRows;
size_t nrColumns;
public:
matrix(size_t rows, size_t columns):
myArray(rows*columns), nrRows(rows), nrColumns(columns)
{
}
double& operator()(size_t row, size_t column)
{
return myArray[row* nrColumns + column];
}
double operator()(size_t row, size_t column) const
{
return myArray[row* nrColumns + column];
}
};
结构:
matrix mat(DIM1, DIM2);
和用法:
double d = mat(1,2);
或
mat(2,1) = 3.14;
调用的类型和函数头不匹配。不能将unique_ptr视为常规指针。
一个解决方案是将您的函数定义更改为:
void funcCall(std::unique_ptr<double[]> *item)
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制