我有这个类,使用属性'word'
class Node {
char *word;
在Node构造函数中,我做了这个asignation:
word = new char[strlen(someword)];
在Node类的析构函数中,我尝试删除word指向的内容:
delete []word;
我在执行程序后获得下一条消息:
“003E4F48处的堆块在003E4F51修改后,请求大小超过1”
我做得不好?
答案 0 :(得分:6)
你的程序中有一个缓冲区溢出,你没有发布的代码中的其他地方。问题是你没有分配足够的内存 - 你没有为字符串末尾的空终止符留出空间。您应该将分配更改为:
word = new char[strlen(someword) + 1]; // +1 for null terminator
...
strcpy(word, someword);
你应该感谢你的C运行时捕获了你的错误。在大多数情况下,一个字节的缓冲区溢出会导致静默内存损坏,直到很久以后才会被检测到,如果有的话。
您还应该考虑使用std::string
类,它会自动为您管理内存,因此您不必处理这样的细微问题。
答案 1 :(得分:1)
strlen
将返回字符串的长度,但不会考虑空终止的额外字节。我的猜测是你正在复制一个字符串并附加一个空字节但你最初分配内存时没有考虑到它。尝试将代码更改为:
word = new char[strlen(someword) + 1];
答案 2 :(得分:1)
你有一个损坏的堆 - 你的代码中的其他地方你在分配的内存之外写或删除你不应该的东西 - 你确定你不是指strlen(someworrd)+ 1?。解决此问题的最佳方法是使用std :;字符串或std :: vector而不是动态数组。