错误:X 处的堆块已修改

Error : Heap block at X modified

本文关键字:修改 错误      更新时间:2023-10-16

我试图为结构使用析构函数。但是,编译器报告的错误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 来释放内存。