2012-03-04 152 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