void CMPT135_String::append(const CMPT135_String &s) /*12*/
{
char *temp = new char[this->getLength()+1];
int len = CMPT135_String::cstrlen(buffer);
for (int i =0; i < len; i++)
temp[i] = this->operator[](i);
for (int i = 0; i < s.getLength()+1; i++)
temp[len+i] = s[i];
if(this->getLength() >0)
delete[] this->buffer;
this->buffer = temp;
}
我一直在与这个 append()
自定义字符串类的成员函数。
该函数工作正常,但运行后我得到一个弹出窗口。
Windows在CMPT135_Assignment1.exe中触发了一个断点。
这可能是由于堆的损坏,这表明Assignment1.exe或其加载的任何DLLs中存在错误。
这也可能是由于用户在CMPT135_Assignment1.exe有焦点时按了F12。
输出窗口可能有更多的诊断信息。
请告诉我这是什么问题。
你没有为新的缓冲区分配足够的内存。 你只分配了足够的内存来复制 this->getLength()
字数 this
,没有空间也复制 s.getLength()
字数 s
到新的缓冲区中,所以你的第二个循环正在破坏新缓冲区末端的随机内存。
试试像这样的方法吧。
void CMPT135_String::append(const CMPT135_String &s) /*12*/
{
int this_len = this->getLength();
int s_len = s.getLength();
int new_len = this_len + s_len;
char *temp = new char[new_len + 1];
for (int i = 0; i < this_len; ++i)
temp[i] = this->operator[](i);
for (int i = 0; i < s_len; i++)
temp[this_len + i] = s[i];
temp[new_len] = '\0';
delete[] this->buffer;
this->buffer = temp;
}