Làm cách nào để kiểm tra điều này == null? Tôi đã tìm thấy điều này trong khi thực hiện đánh giá mã.
Trong tiêu chuẩn C++, không có, vì bất kỳ cuộc gọi nào trên con trỏ null đều không được xác định, vì vậy bất kỳ mã nào dựa vào kiểm tra như vậy đều không chuẩn (không đảm bảo rằng séc sẽ được thực thi).
Lưu ý rằng điều này cũng đúng với các chức năng không phải ảo.
Một số triển khai cho phép this==0
, tuy nhiên, và do đó các thư viện được viết cụ thể cho những triển khai đó đôi khi sẽ sử dụng nó làm hack. Một ví dụ tốt về một cặp như vậy là VC++ và MFC - Tôi không nhớ mã chính xác, nhưng tôi nhớ rõ ràng thấy việc kiểm tra if (this == NULL)
trong mã nguồn MFC ở đâu đó.
Cũng có thể có hỗ trợ gỡ lỗi, vì tại một số điểm trong quá khứ mã này đã bị lỗi this==0
do lỗi trong trình gọi, do đó kiểm tra đã được chèn để bắt các phiên bản tương lai. Một khẳng định sẽ có ý nghĩa hơn cho những điều như vậy, mặc dù.
Nếu điều này == null thì điều đó có nghĩa là đối tượng sẽ bị xóa.
Không, điều đó không có nghĩa là. Nó có nghĩa là một phương thức được gọi trên một con trỏ null, hoặc trên một tham chiếu thu được từ một con trỏ null (mặc dù có được một tham chiếu như vậy đã là U.B.). Điều này không liên quan gì đến delete
và không yêu cầu bất kỳ đối tượng nào thuộc loại này đã từng tồn tại.
Nguồn
2009-12-04 00:10:34
Điều đó không có nghĩa là đối tượng đã bị xóa. Việc xóa một con trỏ sẽ không tự động xóa nó ra, và '((Foo *) 0) -> foo()' là cú pháp hoàn toàn hợp lệ. Chừng nào 'foo()' không phải là một hàm ảo, điều này thậm chí sẽ hoạt động trên hầu hết các trình biên dịch, nhưng nó chỉ là icky. –
"có thể khiến đối tượng bị xóa trong khi một chuỗi khác nằm trong phương thức". Điều này là không thể chấp nhận được, bạn không được xóa một đối tượng trong khi mã khác (trong cùng một luồng hoặc một chuỗi khác) giữ lại một tham chiếu mà nó sẽ sử dụng. Nó cũng sẽ không khiến 'this' trở thành null trong chuỗi khác. –
Tôi đang xem xét một tình huống ngay bây giờ, nơi đây chắc chắn là NULL. Đức Chúa Trời chỉ biết tại sao. – Owl