使用嵌套在向量中的向量转储的分段故障核心

Posted

技术标签:

【中文标题】使用嵌套在向量中的向量转储的分段故障核心【英文标题】:Segmentation Fault Core Dumped with a Vector Nested in a Vector 【发布时间】:2016-06-08 17:18:05 【问题描述】:

我正在尝试使用标准库向量为 Matrix 创建一个类。我在一个向量中使用一个向量来设置矩阵,一个向量代表列,另一个(向量)代表行和存储在行中的值。这是变量和构造函数。

变量:

 int columns;
 int rows;
 std::vector<std::vector<int> > v;

构造函数:

 Matrix(int a, int b)
std::cout << "Input Recieved.. Construct Began" << std::endl;
rows = a;
columns = b;
// Subtract one to put them in a proper array format
rows = rows - 1;
columns = columns - 1;
//Creates the columns
v.reserve(columns);
//Creates the Rows .. Code is ran for every column, this is where the values are set
for(int i = 0; i <= columns; i++)

  v[i].reserve(rows);
  std::cout << "Column " << i  + 1 << " Created, with " << rows + 1<< " Rows" << std::endl;


  //Sets the values of the rows .. is ran for every column
  for(int e = 0; e <= rows; e++)
    if(i == 19)
      std::cout << "Column 20 row setting has begun" << std::endl;
    


    v[i][e] = 2;

    if(i == 19)
    std::cout << "Made it past the line" << std::endl;
  

    std::cout << "Row " << e + 1 << " Set in Column " << i + 1<< ", with Value " << v[i][e] << std::endl;

    if(i == 19)
      std::cout << "Column 20 row setting has finished" << std::endl;
    
  






现在它似乎能够创建除最后一个向量之外的所有内容,然后我得到分段错误。对于更完整的源代码,有这个 http://pastebin.com/AB59bPMR 。

【问题讨论】:

嗯,你有没有在调试器中单步调试你的代码,看看错误在哪里? @OldProgrammer 分段错误(核心转储)是我得到的全部。 听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs @NathanOliver 我已经尝试了大部分(除了橡皮鸭),由于某种原因我无法解决这个问题,我为什么来堆栈交换,我问了其他朋友,并在这里阅读相关问题似乎仍然没有帮助。当我调试时,我把它缩小到 v[i][e] = 2;似乎不想在最后一列中创建行,但我不知道从那里做什么。这就是我在这里的原因。 您有几个错误。 i &lt;= columns 应该是 i &lt; columnse &lt; rows 应该是 e &lt; rows 【参考方案1】:

只需使用方法resize() 来制作你想要多大的矩阵

matrix.resize(rows, vector < int >(columns));

【讨论】:

我使用的保留功能应该做同样的事情吗? ` v.reserve(列);和 v[i].reserve(rows); ` 不,reserve 和 resize 不同。你用错了。 @kfsone 使用调整大小进行了测试,结果相同(与以前的问题不同)。我最初使用调整大小,但是一旦我开始遇到程序问题,就将其更改为保留。不过你是对的,我阅读了 resize 并且我应该使用它,在我的代码中更改它。我仍然有分段错误问题 您需要说明分段错误发生的位置。在你的代码中加入“cout”,看看它在哪里刹车 @MilosRadosavljevic 我已经在我的代码中使用了 cout,它似乎发生在最后一个向量(列)上,它在 v[i][e] = 2; 处中断【参考方案2】:

在 for 循环中犯了一个简单的错误 i &lt;= columns 应该是 i &lt; columns 与行相同。此外,我不应该从 column 和 rows 变量中减去 1。

rows = rows - 1; columns = columns - 1;

应该是

rows = rows; columns = columns;

【讨论】:

【参考方案3】:
columns = columns - 1;
//Creates the columns
v.reserve(columns);
//Creates the Rows .. Code is ran for every column, this is where the values are set
for(int i = 0; i <= columns; i++)

让我们以 1x1 矩阵为例:

columns = columns - 1 => columns = 0
v.reserve(0);    // should be resize
for (int i = 0; i <= 0; i++)

然后,您将尝试访问数组的末尾:空 (size==0) 数组的第一个元素 (element[0])。任何其他值也是如此 - 您访问数组末尾之后。

保持列不变。

Matrix(int a, int b)
    std::cout << "Input Recieved.. Construct Began" << std::endl;
    rows = a;
    columns = b;

    //Creates the columns
    v.resize(columns);

    //Creates the Rows .. Code is ran for every column, this is where the values are set
    for(int i = 0; i < columns; i++) 

【讨论】:

以上是关于使用嵌套在向量中的向量转储的分段故障核心的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:核心转储 C++ 向量对字符串:

试图读取包含整数的文件并存储在整数向量中,但我不断收到“分段错误(核心转储)”错误

在 C 中转储的分段故障核心

创建多个矩阵时出现分段错误(核心转储)

分段故障核心转储错误

分段故障核心转储在 Hermite 中