程序崩溃,消息“终止被称为递归”而不会抛出任何异常

时间:2016-10-11 22:24:23

标签: c++ pointers recursion operator-overloading undefined-behavior

我正在使用CTable制作一个简单的C ++程序 - 我的自定义类。 CTable包含指向int数组的指针,可以使用CTable方法调整大小和操作。

这是一个简短的片段:

class CTable
{
 private:
  int *table; //pointer to the table
  int length; //length of the table
  ///...etc
 public:
  int SetLength(int length); //returns -1 on failure
  int SetValueAt(int index, int value); //returns -1 on failure
  ///...etc
  CTable& operator+=(CTable &other) //combine 2 CTables together
  {
        int oldLength = length;
        SetLength(length+other.GetLength());
        for(int i=oldLength;i<length;i++)
        {
            SetValueAt(i,other.GetValueAt(i-oldLength));
        }
        return *this;
  }
};

我还有另一个用于将用户输入分成单词的函数:

vector<string>* splitString(string sentence, char delim)
{
    vector<string> *res = new vector<string>();
    stringstream ss;
    ss.str(sentence);
    string word;
    while (getline(ss,word,delim))
    {
        res->push_back(word);
    }
    return res;
}

重要的是要注意,此处介绍的所有方法似乎都能正常工作,即当我单独测试时。

正如您所看到的,我还重载了+=运算符。问题是每当我使用此运算符时,下一个用户输入在调用splitString()函数时会崩溃程序。程序崩溃时出现唯一的错误消息“ terminate,名为recursively ”。没有异常被抛出,没有。只有错误代码0xC0000005

我无法真正向您展示整个代码,因为程序非常大,目前大约有1000行代码。我尝试将这个程序修复几个小时,我不知道发生了什么。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

Windows错误代码0xC0000005表示STATUS_ACCESS_VIOLATION。这通常是由指针问题,绑定数组访问,内存损坏和其他严重问题引起的。

splitString()函数看起来没问题,因此它本身并不会导致您所描述的行为。

operator+=()看起来更可疑。代码本身似乎没问题,但它假设SetLength()改变了长度,重新分配了指针,并复制了所有现有的值,所有这些都没有任何问题。请注意,此代码不处理特殊情况,例如在一个self上执行+=

不幸的是,此功能的签名是int SetLength(int length);。因此,参数的名称隐藏了成员length的名称,这可能会导致一些严重的不匹配,从而导致缓冲区溢出或未更改的成员length(除非您使用this->length和{{ 1}}来区分两者。)

最后,您使用的是原始指针而不是智能指针。所以你必须确保rule of 3。如果不这样做,最终会得到浅拷贝,这些拷贝也可能导致UB(当其中一个对象释放其副本仍在使用的内存时)。