2017-01-10 33 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);