我正在使用托管 C++ 模块中的一组非托管 C++ API 函数。我获得了 double
的矩阵来自一个 API 函数的值 ( std::vector<std::vector<double>>
),需要将矩阵作为 double**
传递另一个 API 函数的参数。我总是可以将原始矩阵重新打包成一个新的 double[][]
通过复制元素。但是,我想避免这种情况,因为它对于大型矩阵来说太昂贵了,而且我的方法被频繁调用。
访问原始返回矩阵的元素一定很容易,我写了几个简单的模板方法来做到这一点(见下文),但是它们不起作用,我有点困惑为什么。我可以从内部访问数组的各个元素 Method1
和 Method2
,但是 T**
从任一方法返回的点都无法使用,因为它指向其他地方。有人可以帮帮我吗?
T** Method1(vector<vector<T>> vvT)
{
int size = vvT.size();
if (size == 0)
return NULL;
pin_ptr<T> pin_p1 = &(vvT[0][0]);
T* p1 = pin_p1;
T** p2 = &p1;
return p2;
}
T** Method2(vector<vector<T>> vvT)
{
int size = vvT.size();
if (size == 0)
return NULL;
vector<T*> ptrs(size);
for (unsigned i = 0; i < size; ++i)
{
ptrs[i] = &(vvT[i][0]);
}
T** result = &ptrs[0];
return result;
}
最佳答案
您在堆栈上分配 p1 作为局部变量,然后返回指向它的指针。随着内存被重用,它随后将在函数返回期间或之后被清除。尝试返回 p1 而不是让函数返回 pin_ptr,因为当 pin_ptr 超出范围时,内存无论如何都会被取消固定。
类似的场景是这样的:
int* foo()
{
int x = 2;
return &x;
}
关于.net - 在 vector 的非托管 vector 中访问二维数组 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419144/