检测到堆损坏| C++

Jon*_*nas 8 c++ heap corruption

heap corruption detected运行此代码后,我收到此消息:

uli& uli::operator =(char* n)
{
    char* buffer = new char[strlen(n)];

    char* p;
    int op;
    int coef;

    strcpy(buffer, n);

    while(*buffer)
    {
        op = strlen(buffer) - 5;
        p = (op >= 0) ? op+buffer : buffer;
        coef = atoi(p);

        if(coef > 65535)
            coef = atoi(++p);

        push(head, coef);
        *p = '\0';
    }

    delete buffer;       //  <- heap corruption detected

    return *this;
}
Run Code Online (Sandbox Code Playgroud)

这就是我调用方法的方法:

uli x;
x = "9876123";
Run Code Online (Sandbox Code Playgroud)

"检测到堆损坏"是什么意思?

Ern*_*ill 16

"堆损坏"通常意味着您写入未分配的内存,损坏用于使内存分配器工作的数据结构.

可能会有更多问题,但我看到的第一个就是这一行:

strcpy(buffer, n);
Run Code Online (Sandbox Code Playgroud)

这将写入strlen(n) + 1字节buffer,但buffer只是strlen(n)字节长(额外的字节是终止\0.)写入额外的字节会导致未定义的行为,并可能破坏堆.

  • 此外,不要错过Ates Goral的评论.如果使用`new []`进行分配,则*必须*使用`delete []`自由. (2认同)