如果我没有定义矢量大小,程序会崩溃

时间:2014-05-28 18:10:07

标签: c++ vector crash

目前正在学习C ++并偶然发现了这个问题

std::vector<int> example;

example[0] = 27;

std::cout << example[0];

这会导致程序崩溃,但如果我定义了一个大小std::vector<int> example(1),它就可以了。我还注意到,如果我在不定义大小的情况下使用example.push_back(27)代替example[0] = 27,它也可以正常工作。这背后有理由吗?

4 个答案:

答案 0 :(得分:2)

空向量没有在内存中分配的元素。

您应该使用example.push_back(27)而不是尝试下标。 push_back()分配一个新元素,然后将其添加到向量中。将新元素添加到矢量后,可以使用example[0] = something重新分配。

答案 1 :(得分:1)

原因很简单:空向量没有元素,因此您不能使用下标运算符。没有分配内存,也没有创建可以使用下标运算符访问它的元素 至于方法push_back,它会向向量添加一个元素。 也按照你写的方式使用构造函数

std::vector<int> example(1)

创建一个包含一个元素的向量。

答案 2 :(得分:1)

来自:http://www.cplusplus.com/reference/vector/vector/operator[]/

  

<强>的std ::矢量::操作符[]

     

访问元素

     

返回对向量容器中位置n处元素的引用。

     

类似的成员函数vector :: at与此操作符函数具有相同的行为,除了对vector :: at进行绑定检查,并通过抛出out_of_range异常来通知请求的位置是否超出范围。

     

可移植程序永远不应该使用超出范围的参数n来调用此函数,因为这会导致未定义的行为

这可能会因为std :: map而在STL中引起混淆,例如:

std::map<int, std::string> myMap;
myMap[0] = "hello"

将创建映射(如果尚不存在)。

答案 3 :(得分:1)

更具体地说,您正在使用默认构造函数,因此向量没有义务分配任何内存(因为您没有要求它)。

因此,如果您运行以下代码:

std::vector<int> e;

cout<< e.size() << endl; 
cout<< e.capacity() << endl;

它会打印0和0.因此size0

正如documentation所述:

  

如果容器大小大于n,则函数永远不会抛出   例外(无投保证)。否则,行为未定义。

e.push_back(5);

std::cout << e[0];

会工作。