2012-03-04 30 views
7

tôi có được điều này "heap corruption detected" tin nhắn sau khi chạy đoạn mã này:tham nhũng heap được phát hiện | 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; 
} 

Đây là cách tôi gọi phương thức:

uli x; 
x = "9876123"; 

không "đống tham nhũng được phát hiện" nghĩa là gì?

+2

Sử dụng bộ đệm 'xóa []'. –

+0

Bạn có sử dụng một đối tượng để xử lý bộ nhớ không. Có thể một std :: string thay vì một char *. –

+1

Tôi không phải là tốt – Jonas

Trả lời

14

"Heap tham nhũng" thường có nghĩa là bạn đã viết vào bộ nhớ chưa phân bổ, làm hỏng cấu trúc dữ liệu được sử dụng để làm cho bộ cấp phát bộ nhớ hoạt động.

Có thể có nhiều vấn đề hơn, nhưng một trong những đầu tiên tôi thấy là trên dòng này:

strcpy(buffer, n); 

này sẽ viết strlen(n) + 1 byte để buffer, nhưng buffer chỉ dài strlen(n) byte (byte thêm là chấm dứt \0.) Viết rằng kết quả byte thừa trong hành vi không xác định và cũng có thể làm hỏng heap.

+0

Tôi hiểu. cảm ơn bạn. – Jonas

+0

Bạn được chào đón! Vui lòng chấp nhận câu trả lời khi trang web cho phép bạn. –

+2

Ngoài ra, đừng bỏ lỡ nhận xét của Ates Goral. Nếu bạn phân bổ với 'new []', bạn * phải * miễn phí với 'delete []'. –

Các vấn đề liên quan