2012-03-04 150 views
7

我运行此代码后,拿到这本 “heap corruption detected” 消息:检测到堆损坏| C++

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; 
} 

这是我如何调用该方法:

uli x; 
x = "9876123"; 

什么是 “检测堆损坏” 是什么意思?

+2

使用'delete [] buffer'。 – 2012-03-04 03:02:32

+0

你有没有使用一个对象来处理内存。也许是一个std :: string而不是char *。 – 2012-03-04 03:14:06

+1

我不是那么好 – Jonas 2012-03-04 03:29:05

回答

14

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

可能有更多的问题,但我第一个看到的是在这条线:

strcpy(buffer, n); 

这将写strlen(n) + 1字节到buffer,但buffer只有strlen(n)字节长(额外的字节是终止)编写额外的字节会导致未定义的行为,并且可能会损坏堆。

+0

我明白了。谢谢。 – Jonas 2012-03-04 03:03:52

+0

不客气!请在网站允许的情况下接受答案。 – 2012-03-04 03:05:04

+2

另外,千万不要错过Ates Goral的评论。如果你用'new []'分配,你必须用'delete []'释放。 – 2012-03-04 03:06:38