2014-03-26 122 views
2

我存儲的文本文件列表的載體內,並且要讀取的文本文件的內容到每個迭代的二維數組:刪除2維數組

for(unsigned i=0; (i < files.size()); i++) 
{ 
    std::string file = dir + "/" +files[i]; 
    double** training_vars = new double*; 

    training_vars = readFromFile(file); 

    delete[] &training_vars; 
} 

我讓函數readFromFile決定數組的大小並返回該數組。

我遇到的問題是,每次運行時,都會出現bad_alloc錯誤。我無法在主內部調整二維數組的大小,所以我好像爲了正確刪除數組而在這裏要做什麼。請有任何想法嗎?

+7

這太可怕了。請使用載體。 –

+0

@LightnessRacesinOrbit我不能使用矢量,我正在使用的函數/庫需要雙數組。我可以使用矢量,然後將其轉換爲雙精度。 – Phorce

+0

使用不同的庫或存儲矢量,但在最後一分鐘將指針傳遞給矢量數據。一個圖書館對所有這些手工記憶的詭計都沒有任何藉口,特別是深入的兩個指針。 –

回答

2

程序具有不確定的行爲,這條線是無效的:

delete[] &training_vars; 

因爲&training_vars不是由new []分配(注意:training_vars僅僅是一個指向雙,僅此而已)。

您可能希望readFromFile爲您做分配,可能是通過返回一個智能指針,或者更好的是,通過const引用傳遞vector<>

理想情況下,總是使用std::vector<>並擺脫C風格的陣列,它的目的是爲了避免這樣的情況。


注:

for循環有不必要的括號,並且可以通過一個用於範圍循環替換:

for(auto& file : files) 
{ 
    ... 
} 
0

你真的必須至少有適當的包裝這個庫「RAII」對象並使用現代C++。像這樣的東西會更適合你。

for (auto file : files) 
{ 

    std::shared_ptr< double * > training_vars(readFromFile(file)); 

    // ... the rest of your code that uses training_vars 

} 

而且如其他地方提到的delete[] &training_vars;可能會seg錯誤。您將堆棧本地地址「指向指針的指針」傳遞給名爲training_vars的double來刪除。你想要的是包含在該局部變量中的地址。

+1

當指針不共享時,爲什麼要使用'std :: shared_ptr'? –

+1

我們不知道'// ...你使用training_vars的其他代碼是怎麼回事。它可能最終分享。根據發生的情況,unique_ptr可能更合適。 –