2013-05-12 33 views
0

在讀取文件,它的方便通過矢量分配內存:如何去除矢量容器並返回一個數組?

someType* readCSV() { 
    std::vector<someType> vec; 
    someType x; 
    ... 
    while(fscanf(f, parser, &x) != EOF) { 
     vec.push_back(x); 
     getc(f); // skip comma 
    } 
    return &vec[0]; 
} 

但我只是想返回正常陣列(我使用CUDA的事後,其API使用指針)。

所以問題是vec是否在函數調用結束時超出範圍將會銷燬它所包含的數據,以及是否有任何我可以保留的數據。

+0

'vec'定義在哪裏? – FDinoff 2013-05-12 01:48:37

+1

您可以隨時在'readFile'之外分配'vector'並將其作爲參數傳入。 – 2013-05-12 01:52:35

+0

的確如此,但從封裝破壞的角度來看,這有點麻煩。用戶不應該知道該功能是使用矢量實現的。 – mchen 2013-05-12 01:55:20

回答

0

你不能在一個函數中分配內存,並且不需要在之後不需要清理它。

您可以將函數包裝到存儲向量的類中。然後你可以返回指針,數據將會持續。

class csvReader 
{ 
public: 
    csvReader (void) {} 
    type* readCSV (void) 
    { 
    type x; 
    while(fscanf(f, parser, &x) != EOF) { 
     vec.push_back(x); 
     getc(f); // skip comma 
    } 
    return vec.data(); 
    } 
private: 
    std::vector<type> vec; 
}; 
0

是的,根據您如何聲明它,向量將被分配到堆棧上,因此當您退出範圍時,您返回的引用將變爲無效。

你可以有很多解決方案:

  • 傳遞載體的功能,使主叫方負責其分配和釋放
  • 使用動態數組(如someType *array = new someType[vec.size()],你將負責解除分配的它通過delete[] array
  • 返回載體本身,以便它被壓入堆棧,而不是在離開函數(return vec
釋放
+0

關於動態數組,不就是創建與矢量完全分離的新內存嗎? – mchen 2013-05-12 01:58:44