2012-02-11 31 views
14

tôi đã phát hiện ra mới/xóa lỗi không phù hợp cổ điển trong codebase của chúng tôi như sau:Lỗi nghiêm trọng/không phù hợp của nhà điều hành mới là bao nhiêu?

char *foo = new char[10]; 

// do something 

delete foo; // instead of delete[] foo; 

Chỉ cần như thế nào nghiêm trọng là điều này? Nó có gây ra rò rỉ bộ nhớ hay lỗi không? Hậu quả là gì. Chúng tôi có một số vấn đề về bộ nhớ, nhưng điều này dường như không đủ nghiêm trọng để giải thích tất cả các triệu chứng của chúng tôi (heap tham nhũng, v.v ..)

CHỈNH SỬA: thêm câu hỏi cho rõ ràng
Có miễn phí thành viên đầu tiên của mảng không? hoặc
Hệ thống có làm mất hệ thống không? hoặc
Bộ nhớ bị hỏng là một số cách?

Trả lời

16

Hành vi không xác định nghiêm trọng (nó có thể hoạt động, nó có thể bị lỗi, nó có thể làm điều gì đó khác).

+0

Cảm ơn câu trả lời nhanh. Vì vậy, thực sự không xác định? Như trong, không ai có thể nói điều gì có thể xảy ra? Nếu vậy, nó có thể giải thích những quan sát của chúng tôi. –

+0

@AndrewS. Thực sự không xác định. Tôi nhớ nó "làm việc" trong Visual Studio chẳng hạn. – cnicutar

+2

Không xác định - tức là phụ thuộc vào trình biên dịch/HĐH. –

8

Ngay từ cái nhìn đầu tiên, hãy gọi delete thay vì delete[] không nên quá xấu: bạn phá hủy đối tượng đầu tiên và bạn kích hoạt một số rò rỉ bộ nhớ.

NHƯNG: sau đó, delete (hoặc delete[]) gọi free để giải phóng bộ nhớ. Và free cần địa chỉ được cấp phát ban đầu của nó, để giải phóng bộ nhớ một cách chính xác. Hoặc, điều là, trong khi new trả về địa chỉ ban đầu được phân bổ bởi malloc, new[] trả lại một địa chỉ khác.

Gọi miễn phí trên địa chỉ được trả lại bởi new[] kích hoạt sự cố (giải phóng bộ nhớ hỗn loạn).

Xem những liên kết này rất bài học để hiểu rõ hơn:

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782

http://web.archive.org/web/20080703153358/http://taossa.com/index.php/2007/01/03/attacking-delete-and-delete-in-c

Từ những điều đó là cũng rõ ràng lý do tại sao gọi delete[] thay vì xóa cũng là một ý kiến ​​tồi.

Vì vậy, để trả lời: có, đó là một lỗi rất nghiêm trọng. Nó làm hỏng bộ nhớ (sau khi gọi hàm hủy của đối tượng đầu tiên).

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