.net - 在 vector 的非托管 vector 中访问二维数组 (C++)

标签 .net c++ arrays

我正在使用托管 C++ 模块中的一组非托管 C++ API 函数。我获得了 double 的矩阵来自一个 API 函数的值 ( std::vector<std::vector<double>> ),需要将矩阵作为 double** 传递另一个 API 函数的参数。我总是可以将原始矩阵重新打包成一个新的 double[][]通过复制元素。但是,我想避免这种情况,因为它对于大型矩阵来说太昂贵了,而且我的方法被频繁调用。

访问原始返回矩阵的元素一定很容易,我写了几个简单的模板方法来做到这一点(见下文),但是它们不起作用,我有点困惑为什么。我可以从内部访问数组的各个元素 Method1Method2 ,但是 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/

相关文章:

c - 在 C 中硬编码或替换 char **argv

c# - myVariable(int) == 0 与 myVariable(Guid) == Guid.Empty 相同

c# - .NET XML 序列化数组/列表对象别名

c# - 通用类的强制转换方法参数

c++ - OpenCV - 从图像分割树

c - 在数组初始化期间从不兼容的指针类型进行初始化

javascript - 如果对象值在数组中是唯一的,则执行此操作

c# - session变量赋值给数据表和创建对象引用问题?

c++ - 如何独立编译 Boost.Log

c++ - LuaBind:如何将类的特定实例绑定(bind)到 Lua?