簡體   English   中英

在向量的非托管向量中訪問2D數組(C ++)

[英]Accessing 2D array in unmanaged vector of vectors (C++)

我正在使用托管C ++模塊中的一組非托管C ++ API函數。 我從一個API函數獲得一個double std::vector<std::vector<double>>值矩陣( 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;
}

主要問題是您vector值傳遞vector ,因此一旦函數返回並且vector超出范圍,存儲的地址就不再指向有效內存。 (當ptrs超出范圍時,從Method2返回的地址也是如此。)如果要使用double** (而不是const double** ),則需要通過非const傳遞vector參考。

另一個問題是,您無法在沒有分配任何內存的情況下返回double** ,因此不得不強迫某人稍后deletedelete 您的Method2實現幾乎是正確的方法-而不是處理“ 誰負責delete此內存? ”問題,僅返回std::vector<double*>並且在double**為需要時,改用向量的第0個元素的地址。

template<typename T>
std::vector<T*> Method3(std::vector<std::vector<T> >& vvT)
{
    std::vector<T*> ret;
    for (size_t i = 0, i_max = vvT.size(); i != i_max; ++i)
        ret.push_back(&vvT[i][0]);
    return ret;
}

// ...

std::vector<std::vector<double> > vec = api1();
std::vector<double*> addresses = Method3(vec);
api2(!addresses.empty() ? &addresses[0] : 0);

請注意,一旦傳遞給Method3vector被修改(即,調整大小或銷毀),存儲的指針就有可能指向無效的內存。 還要注意, pin_ptr在這里沒有位置,因為它用於固定托管對象的元素,而std::vector<>不是托管類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM