[英]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[][]
。 但是,我想避免這種情況,因為使用大型矩陣以及我的方法經常被調用會變得過於昂貴。
訪問原始返回的矩陣的元素必須很容易,我編寫了幾個簡單的模板方法來做到這一點(見下文),但是它們不起作用,我對此有些疑惑。 我可以從內部訪問數組的單個元素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;
}
主要問題是您vector
值傳遞vector
,因此一旦函數返回並且vector
超出范圍,存儲的地址就不再指向有效內存。 (當ptrs
超出范圍時,從Method2
返回的地址也是如此。)如果要使用double**
(而不是const double**
),則需要通過非const傳遞vector
參考。
另一個問題是,您無法在沒有分配任何內存的情況下返回double**
,因此不得不強迫某人稍后delete
其delete
。 您的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);
請注意,一旦傳遞給Method3
的vector
被修改(即,調整大小或銷毀),存儲的指針就有可能指向無效的內存。 還要注意, pin_ptr
在這里沒有位置,因為它用於固定托管對象的元素,而std::vector<>
不是托管類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.