检测到堆损坏(类方法)

Heap corruption detected (class method)

本文关键字:类方法 损坏 检测      更新时间:2023-10-16

通过运行此代码,我得到"检测到堆损坏"。

    E3Point E3Point::operator+(E3Point & t)
    {
    E3Point ret;
    ret.naziv = new char[strlen(naziv) + strlen(t.naziv) + 1];
    ret.naziv = strcat(naziv, t.naziv);
    ret.X = X + t.X;
    ret.Y = Y + t.Y;
    ret.Z = Z + t.Z;
    return ret;
    }

这两行会导致两个问题:

ret.naziv = new char[strlen(naziv) + strlen(t.naziv) + 1];
ret.naziv = strcat(naziv, t.naziv);

第一种是std::strcpy追加到第一个参数提供的字符串。如果你没有足够的内存分配给它,你将有未定义的行为,因为strcat写出界外。

第二个问题是strcat返回目的地,这意味着你正在有效地执行

ret.naziv = naziv;

因此丢失了前一个new[]给出的原始指针,这会导致内存泄漏(以及可能的其他问题)。

简单的解决方案是停止使用旧的 C 样式以 null 结尾的字节字符串,而是使用 std::string

在这一行:

ret.naziv = strcat(naziv, t.naziv);

您没有正确复制字符串。您正在将t.naziv复制到this->naviz而不是ret.naziv 中。然后你把返回的指针分配给ret.naviz,泄漏你new的内存,并使ret.navizthis->naziv指向同一个内存。

您需要改用它:

strcpy(ret.naziv, naziv);
strcat(ret.naziv, t.naziv);

或者:

int len = strlen(naziv);
...
strcpy(ret.naziv, naziv);
strcpy(ret.naziv+len, t.naziv);

或者:

sprintf(ret.naziv, "%s%s", naziv, t.naziv);

此外,如果您尚未这样做,请确保遵循 3/5/0 规则,否则会遇到其他问题。

您真的不应该手动管理内存。让标准库为您完成。如果nazivstd::string而不是char*,所有这些问题都会消失。