2013-04-24 95 views
1

工作時C++分段錯誤我正在與3D向量和一切工作完美。當我添加並使用流文件時出現了分段錯誤。 我完全不理解這個問題。 下面的代碼不起作用:與<vector>和<fstream>

#include <iostream> 
#include <vector> 
#include <fstream> 

std::vector < std::vector < std::vector <float> > > hand; 


int main(){ 

//First Part 
std::ofstream file; 
file.open("test.csv"); 
file << "Hello World!"; 
file.close(); 

//Second Part 
hand.reserve(20); 
for (int i=0; i<hand.capacity(); i++){ 
    hand[i].reserve(4); 
} 

return 0; 
} 

如果你對此有何評論代碼將很好地工作的組成部分之一。當您想要同時使用它們時,出現分段錯誤。

同樣重要的是要注意到,該代碼可以工作,如果不是:

hand.reserve(20); 

我們用下面8號:

hand.reserve(7); //or lower 

我的問題是:爲什麼不工作的代碼當我同時使用它們?我能做些什麼來解決它?你有關於這個特殊情況的解釋嗎?

我必須在一個更大的代碼中實現它,所以最好知道根本原因並避免在接下來的情況下。

+0

你有沒有調試應用程序,並尋找任何0值? – 2013-04-24 08:04:31

回答

5

變化

hand.reserve(20); 

hand.resize(20); 

reserve只會更改矢量能力來存儲數據,而不會產生任何實際的對象。因此使用reserve你將會得到空的矢量,它能夠接受20個新的值而不需要重新分配。 capacity()size()不同,它返回向量已經分配內存的元素的數量,它可以大於返回實際元素數的size()

1

reserve只增加矢量的容量,不增加其實際尺寸。

但是,在你的循環中,當你做hand[i]時,你正在訪問矢量的項目,就好像它已經被實際調整大小一樣,但實際上這些項目還不存在。因此段錯誤。

您可能需要將第一個reserve呼叫替換爲resize(也可能是其他後續reserve呼叫)。

2

僅僅因爲你爲他們保留了空間......他們還沒有被構造,你不能開始使用元素(即hand[i].)。您應該使用resize(20)不僅要求存儲也初始化的hand元素,之後就可以reserveresize所包含的容器....