Trong một vài dự án mã cũ của tôi khi tôi chưa từng nghe đến con trỏ thông minh, bất cứ khi nào tôi cần kiểm tra xem con trỏ vẫn trỏ đến một đối tượng hợp lệ, tôi sẽ luôn làm một cái gì đó như thế này ...Nullptr và kiểm tra xem con trỏ trỏ đến một đối tượng hợp lệ
object * meh = new object;
if(meh)
meh->member;
Hoặc khi tôi cần thiết để xóa các đối tượng một cách an toàn, một cái gì đó giống như
if(meh)
{
delete meh;
meh = 0;
}
Vâng này, bây giờ tôi đã học về các vấn đề có thể phát sinh từ việc sử dụng các đối tượng và con trỏ trong các biểu thức boolean cả với các số theo nghĩa đen, theo cách cứng:. Và bây giờ tôi cũng đã học về tính năng không mới nhưng khá thú vị của C++, từ khóa nullptr
. Nhưng bây giờ tôi tò mò.
Tôi đã trải qua và sửa đổi hầu hết mã của tôi do đó, ví dụ, khi xóa đối tượng tôi bây giờ viết
if(meh)
{
delete meh;
meh = nullptr;
}
Bây giờ tôi đang tự hỏi về boolean. Khi bạn chuyển, chỉ cần nói int vào câu lệnh if như thế này,
int meh;
if(meh)
Sau đó, nó kiểm tra hoàn toàn bằng 0 mà không cần viết.
if(meh == 0) // does the exact same check
Bây giờ, C++ có làm tương tự cho con trỏ không? Nếu vượt qua trong một char * như thế này để một tuyên bố nếu?
char * meh;
if(meh)
Sau đó, nó sẽ hoàn toàn so sánh nó với nullptr? Vì tôi đã viết những ifs như thế này bao lâu, nên đây là bản chất thứ hai tại thời điểm này để kiểm tra xem con trỏ có hợp lệ trước khi sử dụng hay không bằng cách gõ if (object *) và sau đó gọi các thành viên của nó. Nếu đây không phải là chức năng thì tại sao lại không? Quá khó thực hiện? Sẽ giải quyết một số vấn đề bằng cách loại bỏ một cách nhỏ khác mà bạn có thể làm rối tung mã của bạn.
Bạn không ** cần ** ckeck con trỏ trước khi 'xóa'. Nó là hoàn toàn an toàn để 'xóa' một' nullptr'. –
Trong ví dụ cuối cùng của bạn, bạn có nghĩa là 'char * meh = nullptr; nếu (meh) '? Con trỏ không được khởi tạo. –
Kết quả của biểu thức 'mới' của bạn sẽ không bao giờ là rỗng, ngoại lệ được sử dụng thay thế. An như đã đề cập, xóa null là tốt, nó không có gì. Ngoài ra, tốt hơn hết là không đặt lại giá trị con trỏ thành null. Lần cuối cùng nó được sử dụng nên là lần cuối cùng nó không phải là null, do đó, có quyền truy cập vào một con trỏ bị xóa nên được coi là một lỗi; thiết lập nó để ẩn nó. – GManNickG