0

我有最简单的课文:

class Text
{
    char* txt;
public:
    Text(const char*);
    Text(const Text&);
    ~Text();

    const Text operator+(const Text&) const;
};

和实施:

#include "text.h"

Text::~Text()
{
    delete[] this->txt;
}


Text::Text(const char* argText)
{
    txt = new char[strlen(argText)+1];
    strcpy(txt, argText);
}

Text::Text(const Text& other)
{
    txt = new char[strlen(other.txt)+1];
    strcpy(txt, other.txt);
}

const Text Text::operator+(const Text& other) const
{
    char* ttxt, *newLine;
    ttxt = new char[strlen(txt)+strlen(other.txt)+2];
    strcat(ttxt, this->txt);
    newLine = new char[2];
    newLine[0] = '\n';
    newLine[1] = '\0';
    strcat(ttxt, newLine);
    strcat(ttxt, other.txt);
    Text temp(ttxt);
    delete[] newLine;
    return temp;
}

主要:

#include "text.h"

int main()
{
    Text a("First text.");
    Text b("Second lol!!\n kthxbye!!!!!!!");
    Text c(a+b);
}

并且程序中断了newLine = new char[2];我尝试增加它,例如 new char[5] 但它仍然中断。我收到的信息是:

Windows 已在 prTextClass.exe 中触发断点。

这可能是由于堆损坏,这表明 prTextClass.exe 或其已加载的任何 DLL 中存在错误...

4

3 回答 3

2

我认为 Text::operator+ 中的这条线即

strcat(ttxt, this->txt);

是错的,应该是

strcpy(ttxt, this->txt);

您当前正在添加到新随机内存的末尾,而不是像 strcpy 那样从 ttxt 开始。

但是在 C++ 中更好的解决方法是使用 std::string 而不是 char* 来保存字符串——它会为你分配内存,从而阻止你犯这些错误。

还如注释中所述 ttxt 泄漏未删除,您应该有一个 operator= 来处理 Text a = b;

于 2012-08-01T18:38:56.197 回答
2
const Text Text::operator+(const Text& other) const
{
    char* ttxt, *newLine;
    ttxt = new char[strlen(txt)+strlen(other.txt)+2];
    strcat(ttxt, this->txt);
 // ^^^^^^^^^^^^^^^^^^^^^^^^ This line is buggy
    newLine = new char[2];
    newLine[0] = '\n';
    newLine[1] = '\0';
    strcat(ttxt, newLine);
    strcat(ttxt, other.txt);
    Text temp(ttxt);
    // ....

注意ttxt = new char[strlen(txt)+strlen(other.txt)+2];不初始化数组内容。因此,当strcat()被调用时,它会ttxt找到第一个'\0'字符作为字符串的结尾ttxt,因此停在一个未知的位置。

你应该把它改成

strcpy(ttxt, this->txt);
于 2012-08-01T18:39:25.390 回答
0

断线之前的 strcat 可能是罪魁祸首

您可能应该在分配 txtt 或确保 strcat 不会继续追加之后将其清空。IE。确保第一个字符是 0 字节。

于 2012-08-01T18:37:23.920 回答