2D矢量分配器故障

时间:2013-01-30 10:23:41

标签: c++ stdvector allocator

#include <iostream>
#include <vector>

int main()
{
    std::vector<double> test1(1);

    test1[100] = 5.;

    std::vector< std::vector <double > > test2(1, std::vector<double>(1,0));

    test2[50][100] = 5.;
}

test1:很好地调整大小并分配内存

test2"Segmentation fault (core dumped)"。为什么呢?

注意:不能使用矩阵,因为行大小不相等。

摘要at(int):检查边界并在必要时抛出异常 - 没有调整大小

operator[](int):不检查边界 - 没有调整大小

push_back():如果当前容量很小,则将capacity()的大小增加一倍

size()vector

中的元素数量

capacity():在重新分配之前要保留的最大元素

4 个答案:

答案 0 :(得分:3)

您可以访问大小为1的向量的索引为100的元素。您不应该从向量边界中访问索引。事实上,它是纯粹的运气,它在第一种情况下起作用而不是奇怪的第二种情况不起作用。

向量会在调用resize()push_back时展开,但只是访问索引不会扩展向量的大小。相反,它会导致未定义的行为。

修复代码do(更改构造向量时使用的大小):

#include <iostream>
#include <vector>

int main()
{
    std::vector<double> test1(101);

    test1[100] = 5.;

    std::vector< std::vector <double > > test2(51, std::vector<double>(101,0));

    test2[50][100] = 5.;
}

答案 1 :(得分:1)

您正在访问每个向量的边界之外:

std::vector<double> test1(1); // size 1 vector
test1[100] = 5.; // out of bounds access

结果是未定义的行为。如果你想制作100号矢量,请执行以下操作:

std::vector<double> test1(101); // size 101 vector
test1[100] = 5.; // OK, access 101th element
test.push_back(42); // push element, size is now 102

答案 2 :(得分:1)

  

test1:很好地调整大小并分配内存

std :: vector将在调用std::vector::push_back时调整大小并分配内存,但不能通过随机访问运算符随机分配

  

test2:“分段错误(核心转储)”。为什么呢?

下面的代码访问超出了test1的范围,test2:

test1[100] = 5.0;
test2[50][100] = 5.0;

您可以在访问前测试矢量大小

if (test1.size() > 100))
{
    test1[100] = 5.0;
}  

或者可以在try / catch块中使用std::vector::at函数:

try
{
    test2.at(50).at(100) = 5.0;
}
catch(const std::exception& e)
{
   std::cout << e.what() << std::endl;
}    

答案 3 :(得分:0)

如果您希望operator []自动展开/插入,请使用std :: map:

#include <iostream>
#include <map>

int main()
{
    std::map<double> test1;

    test1[100] = 5.; // Will insert one element into test1

    std::map< std::map <double > > test2;

    test2[50][100] = 5.; // will create a new map<double> and insert one element into it.
}