2011-11-04 43 views
6

thể trùng lặp:
Is there any reason to check for a NULL pointer before deleting?Xóa một con trỏ null

Tôi thường thấy như sau trong mã:

if(pointer) 
    delete pointer; 

Để hiểu biết của tôi nó là an toàn để xóa một null con trỏ, vậy điểm kiểm tra này là gì?

+2

..... Có an toàn không? – slartibartfast

+3

Điểm quan trọng cần nhớ là đặt NULL sau khi xóa. – vrrathod

+1

Để hiểu biết của tôi, sự hiểu biết của bạn là chính xác nhưng không phải tất cả mọi người đều chia sẻ nó. Nhưng chúng ta hãy xem những gì các ngôn ngữ laywers nói. – delnan

Trả lời

9

delete sẽ kiểm tra xem con trỏ có NULL cho bạn không, do đó bạn đúng là không cần kiểm tra. Bạn cũng có thể thấy rằng một số người đặt con trỏ thành NULL sau nó sẽ bị xóa để bạn không làm bất cứ điều gì ngu ngốc như thử và sử dụng bộ nhớ không còn là của bạn hoặc ngăn bạn xóa con trỏ hai lần, sẽ gây ra lỗi.

+0

Để bình luận của bạn "để bạn không làm bất cứ điều gì ngu ngốc như thử và sử dụng bộ nhớ mà không còn là của bạn", thậm chí dereferencing một con trỏ null là một UB. Nó rất hữu ích trong trường hợp khi con trỏ bị xóa một lần nữa (xóa đôi mà bạn đã đề cập) –

1

Trong khi an toàn ngay bây giờ, không phải lúc nào cũng :-) vì vậy có khả năng là thường xuyên. Ngoài ra còn có những hậu quả khác để xóa. 1) nếu bạn đang sử dụng một trình quản lý bộ nhớ chuyên dụng và ghi đè các toán tử mới và xóa, thì bạn có thể phải thực hiện kiểm tra Operator Delete để biết thêm chi tiết

+6

'[cần dẫn nguồn]'. Đó là một điều khá dễ dàng để thêm, và IIRC C đã đảm bảo rằng 'miễn phí' xử lý' NULL' một cách chính xác kể từ khi mãi mãi (ít nhất là C89, tôi sẽ không ngạc nhiên nếu nó đã được trong ANSI C quá). Vì vậy, tôi thấy thật khó để tin rằng có bao giờ là một C++ thực hiện có thể sử dụng mà không thể xử lý 'xóa NULL;'. – delnan

1

Séc không cần thiết.

The documentation bang mà xóa sẽ "deallocate khối bộ nhớ được trỏ bởi ptr (nếu không muốn nói-null)"

0

Hầu hết mọi người làm điều này vì họ thường có xử lý bằng cách khác (trừ mà tôi không thực sự thấy lỗi điểm làm kiểm tra). Trong một số trường hợp, họ làm điều đó để kiểm tra xem họ đang giải phóng một cái gì đó và không vô tình thay đổi một con trỏ ở đâu đó và gây rò rỉ bộ nhớ bằng cách không giải phóng nó. free(NULL); nên hoạt động trong mọi trường hợp và không bị lỗi vì vậy trừ khi có lỗi xử lý liên quan đến bạn có thể xóa câu lệnh if và chỉ thực hiện việc miễn phí.

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