错误:X 处的堆块已修改
Error : Heap block at X modified
我试图为结构使用析构函数。但是,编译器报告的错误Heap block at 006651F8 modified at 00665229 past requested size of 29 gift1.exe has triggered a breakpoint.
#include "stdafx.h"
struct Node{
char *name;
int age;
Node(char *n = 0, int a = 0){
this->name = _strdup(n);
age = a;
}
~Node(){
if (this->name != 0)
delete[] this->name;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Node node1("Andy", 20);
return 0;
}
我可以知道哪里出了问题吗?
我是否使用name
而不是this->name
有关系?
附加组件:
即使我按照以下答案的建议将其更改为free(this->name);
,也会出现相同的错误。 Heap block at 00EA68D8 modified at 00EA6909 past requested size of 29 gift1.exe has triggered a breakpoint.
_strdup
内部使用malloc()
:
_strdup
函数调用malloc
为 strSource 的副本分配存储空间,然后将 strSource 复制到分配的空间。
但您正在使用delete[]
来解除分配:
解除分配以前由匹配的操作员分配的存储 新...如果传递给标准库释放函数的指针不是从相应的标准库分配函数获取的,则行为未定义。
要解决,请使用std::string
而不是char*
(或者如果您确实无法使用std::string
请使用free()
并阻止复制或实现复制Node
)。
如果您检查 _strdup
(又名 strdup
)的文档,您会发现它在内部使用 malloc
来分配字符串,因此必须通过调用 free
而不是 delete
来释放内存。
相关文章:
- 错误:表达式必须是可修改的 I值
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- 如何修复对象在释放后可能修改的malloc错误
- 错误表达式必须是插入函数(二叉树 C++)中的可修改 Ivalue
- 代码错误修改
- 我在代码中收到一个运行时错误,该错误如何通过修改最多一个元素来查找数组是否可以变得不减少
- 当我要修改指针到常量整数时,为什么我的编译器不显示错误
- Python是否以错误的顺序删除了swip?可以修改吗?
- 尝试修改 Hbitmap 数据时出现堆栈错误
- 错误:表达式必须是可修改的LVALUE
- Matlab 编码器错误 "for loop index expressions.." 如何修改代码?
- 静态链接 MFC 时,未修改的 Visual Studio 2012 MFC 模板中出现链接错误
- Xcode 4.5.2 致命错误:预编译标头已被修改
- 我应该在标头"fcntl.h"中修改此错误吗?
- 在c++中修改时间程序时出现逻辑错误
- 错误:X 处的堆块已修改
- 使用 OpenCV 修改图像时 RGB 值错误
- 错误 C2165:'left-side modifier':无法修改指向数据的指针
- c++ 修改驱动程序,出现"cannot convert from overloaded function"错误
- 视觉获取链接错误:C++中的外部.如何访问在文件 A 中修改的变量的值.CPP在另一个文件 B .CPP中修改