检测到堆损坏(类方法)
Heap corruption detected (class method)
通过运行此代码,我得到"检测到堆损坏"。
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.naviz
和this->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 规则,否则会遇到其他问题。
您真的不应该手动管理内存。让标准库为您完成。如果naziv
是std::string
而不是char*
,所有这些问题都会消失。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在静态库中嵌入类方法
- 如何制作一个将函数作为参数的类方法
- 从父类方法返回子类对象
- 使用用户定义的参数调用future/async并调用类方法
- 重载类方法的不明确调用
- 单独定义模板化嵌套类方法的正确语法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何访问由共享指针保存的类方法?
- 将子类方法声明为基类的友元
- 我的模板类方法返回错误类型?
- Qt将信号与另一个类方法连接
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 检查类方法中是否(此 == nullptr)
- 从基类实例调用派生类方法而不进行强制转换
- 函数从唯一代码调用正确的子类方法
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 检测到堆损坏(类方法)