我正在使用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行代码。我尝试将这个程序修复几个小时,我不知道发生了什么。非常感谢任何帮助!
答案 0 :(得分:2)
Windows错误代码0xC0000005
表示STATUS_ACCESS_VIOLATION
。这通常是由指针问题,绑定数组访问,内存损坏和其他严重问题引起的。
splitString()
函数看起来没问题,因此它本身并不会导致您所描述的行为。
operator+=()
看起来更可疑。代码本身似乎没问题,但它假设SetLength()
改变了长度,重新分配了指针,并复制了所有现有的值,所有这些都没有任何问题。请注意,此代码不处理特殊情况,例如在一个self上执行+=
。
不幸的是,此功能的签名是int SetLength(int length);
。因此,参数的名称隐藏了成员length
的名称,这可能会导致一些严重的不匹配,从而导致缓冲区溢出或未更改的成员length
(除非您使用this->length
和{{ 1}}来区分两者。)
最后,您使用的是原始指针而不是智能指针。所以你必须确保rule of 3。如果不这样做,最终会得到浅拷贝,这些拷贝也可能导致UB(当其中一个对象释放其副本仍在使用的内存时)。