2017-01-10 84 views
0

考慮下面的代碼:C++矢量<int>數組初始化

vector<int> A[1000000]; 
for(int i = 0; i < 1000000; i++){ 
    A[i].clear(); 
} 

我運行它具有測試用例我的代碼運行自動終端上,所以我不能得到充分的調試消息。我沒有得到任何錯誤,並且程序似乎在單個測試用例下運行良好。然而,當我跑完全套我通過/失敗的測試案例隨機(有一次我可以通過第一個3,另一個通過除了他們以外的所有東西,另一個我只通過第二個等)。我想確保這種初始化會擺脫陣列上的「未定義」值(例如,char *buffer = new char[100]; buffer[0] = 0;),以避免它導致隨機崩潰。

sizeof(A) == 24000000(〜23MB),sizeof(int) == 4。我只給這些向量添加了100萬個整數(總數),所以在最差的測試中,每個向量可以是一個元素向量,或者一個向量可以有一百萬個整數,而其餘的則是空的。

我必須調用析構函數嗎?我沒有假設,因爲我從來沒有稱過新的,但我是STL的新手。最後,這可能不是我的代碼但是測試人員的問題,但仍然需要確保我的方面沒問題。

+1

此代碼是OK循環使用,有可能是一個錯誤的其他地方。或者堆棧溢出 –

+0

你試過了嗎,'vector A(1000000,0);'?這將用零填充矢量。 – tinstaafl

+0

@tinstaafl這是一個單獨的向量,OP代碼會生成一百萬個向量(我認爲這是有意的) –

回答

6

我認爲這是一個堆棧溢出,正如M.M所建議的。該行

std::vector<int> A[1000000]; 

在堆棧上創建了100萬個矢量對象,這太多了。在我的機器上,這個例子失敗了一百萬個載體,但它可以正常工作一千個。

+0

你確定嗎? sizeof(A)返回24000000給我,那只有23MB,我只會向這些向量添加100萬個整數(總計),所以每個向量可以是一個元素向量,或者一個向量可以有一百萬個,而其餘的依然存在空。 – gia

+0

例如,Visual Studio中的默認堆棧大小爲1 MB。改爲使用'new'運算符在堆上創建您的向量數組。 – Ari0nhh

+1

不要使用'new' ...向量矢量或矢量數組的'unique_ptr'會更好一些 –

0

在地方的下面代碼

std::fill(A.begin(), A.end(), 0);