2015-04-04 108 views
0

下面的代码工作正常上ideone,给人如预期为什么我的向量<int>不是默认为0?

但是我的本地机器上的

10000 
10000 

输出,输出的是那种

9990 
9998 

所有的代码做的创建一个10k int的向量并计算其中的0的数量。一旦使用了课程,并且一次使用了课程。

如果我在调试模式下运行本地代码,它导致

0 
0 

我使用的代码块在Windows 7默认的GNU GCC编译器(尽管它编译C++,所以我想比其不同在Linux GCC这确实仅C)

#include<iostream> 
#include<vector> 
using namespace std; 
class vecttest 
{ 
    vector<int> vect; 
    public: 
    vecttest() 
    { 
     vect.reserve(10000); 
    } 
    int zcount() 
    { 
     int count=0; 
     for(int i=0;i<10000;i++) 
     { 
      if(vect[i]==0) 
       count++; 
     } 
     return count; 
    } 
}; 
int main() 
{ 
    vecttest v; 
    cout<<v.zcount(); 

    vector<int> v2; 
    v2.reserve(10000); 
    int count=0; 
     for(int i=0;i<10000;i++) 
     { 
      if(v2[i]==0) 
       count++; 
     } 
    cout<<endl<<count; 
} 

ideone链路:http://ideone.com/q1XRvQ

+0

你为什么认为它应该默认为零?你只是保留空间 – 2015-04-04 06:42:03

+0

@EdHeal这就是接受的答案中提到的行为http://stackoverflow.com/questions/5222404/c-value-of-uninitialized-vectorint – Akash 2015-04-04 06:44:28

+4

你应该使用'vect.resize(10000,0 );' – 2015-04-04 06:45:05

回答

2

方法储备(..)只保证空间被分配。它不保证矢量元素中的值。唯一会发生的是你的计数不会崩溃。结果值是执行/分配/等依赖。

的核心思想就是要了解有关容器和迭代器是它们是相同不安全的简单数组:

char b1[100]; 
vector<char> b2(100); 

void f() 
{ 
    char c1 = b1[200]; 
    char c2 = b2[300]; 
} 

在这两种情况下,编译器将生成的代码,将捡东西的阵列外。两个例子都会触发未定义的行为也许代码会崩溃,也许不会。这两种访问都同样糟糕。

这种设计的主要原因是速度。访问数组应该很快。这是C/C++的核心思想。该指数的价值是程序员的责任。编译器不会检查。喜欢与否,这是如此。

+0

计数甚至不保证不会崩溃。从外部读取矢量的实际大小是未定义的行为。 (正如通过对严格别名规则的一些解释,将未构造的内存区域解释为'int')。 – Mankarse 2015-04-04 08:06:29

+0

非常严格地说你是对的。我敢打赌,任何没有非调试实现的数量都会崩溃。调试实现将抛出异常... – 2015-04-04 08:09:58

+0

调试实现将肯定不会抛出异常,因为例外是用于正常的错误处理。有了未定义的行为,您想中止执行,以便程序员可以修复代码,但这不是您的流程可以从中恢复的。 – 2015-04-04 08:18:51

相关问题