【问题标题】:C++ Assertion Failed on vector at runtime Expression: vector subscript out of rangeC++ 断言在运行时向量上失败表达式:向量下标超出范围
【发布时间】:2011-04-20 21:24:06
【问题描述】:

我收到了这个非常烦人的错误信息。我知道我对此只是新手,但似乎我能弄清楚的事情类型。谁能告诉我我哪里出错了?

运行时的消息是: 调试断言失败! 程序: …… 文件:c:\program files\microsoft visual studio 10.0\vc\include\vector 线路:932 表达式:向量下标超出范围

代码是

#include "VectorIntStorage.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

void VectorIntStorage::Read(istream& r)
{
    char c[13];
    r >> c;
    r >> NumberOfInts; //gets number of ints for vector

    //numberVector = new std::vector<int> numberVector;

    for(int i = 0; i < NumberOfInts; i++)
    {
        r >> numberVector[i];
        cout << numberVector[i] << endl;

        if(_sortRead) //true
        {
            for(int k = 0; k < i; k++)
            {
                if(numberVector[i] < numberVector[k])
                {
                    int temp = numberVector[k];
                    numberVector[k] = numberVector[i];
                    numberVector[i] = temp;
                }
            }
        }
    }
}

void VectorIntStorage::Write(ostream& w)
{
    for(int i = 0; i < NumberOfInts; i++)
    {
        w << numberVector[i] << endl;
        cout << numberVector[i] << endl;
    }
}

void VectorIntStorage::sortStd()
{
    sort(numberVector.begin(), numberVector.end());
}

void VectorIntStorage::sortOwn()
{
    quickSort(0, NumberOfInts - 1);
}

void VectorIntStorage::setReadSort(bool sort)
{
    _sortRead = sort;
}

void VectorIntStorage::quickSort(int left, int right)
{
     int i = left, j = right;
      int tmp;
      int pivot = numberVector[(left + right) / 2];

      while (i <= j)
      {
            while (numberVector[i] < pivot)
                  i++;
            while (numberVector[j] > pivot)
                  j--;
            if (i <= j) 
            {
                  tmp = numberVector[i];
                  numberVector[i] = numberVector[j];
                  numberVector[j] = tmp;
                  i++;
                  j--;
            }
      }

      if (left < j)
      {
            quickSort(left, j);
      }
      if (i < right)
      {
            quickSort(i, right);
      }
}

VectorIntStorage::VectorIntStorage(const VectorIntStorage& copying)
{
    //int *duplicate = new int[(copying.NumberOfInts)];
    //vector<int> *duplicate = new vector<int>;

    //std::copy(numberVector.begin(), numberVector.end(), duplicate);
    //numberVector = duplicate;
    //NumberOfInts = copying.NumberOfInts;
}

VectorIntStorage::VectorIntStorage(void)
{
}


VectorIntStorage::~VectorIntStorage(void)
{
}

【问题讨论】:

  • 我们没有行号,所以说明哪一行会有帮助
  • 没有行号,是运行时错误,抱歉,应该提一下
  • @Tanya - 调用哪个方法导致断言失败?
  • 我希望我知道,这就是我给你整个 cpp 代码的原因,因为当我尝试运行它时它会出现一个错误消息框
  • 您应该尝试使用调试器来查找触发断言的方法调用。顺便说一句,numberVector 是如何初始化的?在 VectorIntStorage::Read(..) 中使用下标运算符是否足够长?

标签: c++ vector assertion


【解决方案1】:

我们没有足够的信息可以肯定地说,但我怀疑失败的行是r &gt;&gt; numberVector[i]。我想你的意思是说int j; r &gt;&gt; j; numberVector.push_back(j);

问题正是错误消息所说的:您的向量下标 (i) 超出范围。具体来说,您永远不会增加向量的大小,因此它的大小始终为 0。因此,operator[] 的任何使用都将引用超出范围的元素。

【讨论】:

  • 除此原因外,发生内存泄漏时是否会出现此错误?
【解决方案2】:

您不能只使用numberVector[i] 而不先调用numberVector.resize()

vector<int> vec;
vec[1] = 0; // fails - vec is empty so [1] is out of range
vec.resize(100);
vec[1] = 5; // ok, you can access vec[0] .. vec[99] now
vec.push_back(11); // Now the size is 101 elements, you can access vec[0] .. vec[100]

【讨论】:

    【解决方案3】:
    r >> NumberOfInts; //gets number of ints for vector
    

    从上面的评论看来,你需要一个大小为NumberOfInts 的向量。但留下评论 -

    //numberVector = new std::vector<int> numberVector;
    

    您将向量声明为 -

    std::vector<int> numberVector; // The size of the vector is 0
    

    []numberVector 的操作,在声明时需要说明它的大小并且在有效范围内。由于声明时没有提到,所以需要做一个push_back操作来动态增加向量的大小。

    for(int i = 0; i < NumberOfInts; i++)
    {
        r >> numberVector[i];    // Size isnot initially mentioned while declaration 
                                 // of the vector to do an `[]` operation
        cout << numberVector[i] << endl;
        // ....
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2016-05-02
      • 1970-01-01
      • 2017-06-18
      • 2021-12-22
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多