Xin chào mọi người, mình muốn hỏi về vấn đề check nullptr khi đã delete.
Mình có đoạn code như sau
#include <iostream>
#include <vector>
#include <string>
using std::cout;
using std::string;
class Person {
  string name_;
  Person* friend_;
public:
  Person(string const & name) : name_(name){}
  string  name() const {return name_;}
  Person* get_friend() const { return friend_;}
  void    add_friend(Person* p) {friend_ = p;}
  bool    have_friend() const { return (friend_ != nullptr);}
};
int main() {
  Person tom{"Tom"};
  Person* new_friend = new Person{"Will"};
  tom.add_friend(new_friend);
  delete new_friend;
  
  cout << "Does " << tom.name() << " have friend?: " << ( tom.have_friend() ? ("YES") : ("NO")) << '\n';
  if(tom.have_friend()){
    // cout << tom.name() << "'s friend is " << tom.get_friend()->name() << '\n';
  }
}
Vấn đề: mặc dù đã có delete new_friend rồi nhưng với điều kiện trong hàm have_friend() chỉ là so sánh friend_ != nullptr nên hàm này vẫn trả về TRUE.
Đến đoạn in ra thì sẽ bị lỗi rồi vì access vào vùng memory đã bị delete (SEGFAULT) thông qua tom.get_friend()->name()
Thử nghiệm: Mình có thể giải quyết vấn đề này bằng việc thêm một vài member để keep track của những pointer được trỏ vào, hoặc một cách khác là sử dụng smart pointer, nhưng mình đang muốn tìm một cách giải quyết khác dựa vào những gì có sẵn.
#Update: làm rõ câu hỏi
Câu hỏi: Giả sử trong trường hợp bất khả kháng mình phải sử dụng raw pointer và ngoài 2 cách đã nêu (keep track và sử dụng smart pointer) thì C++ có feature/library/function nào để mình có thể kiểm tra được friend_ đã bị delete hay chưa. (Expectation: Sau khi gọi delete thì hàm have_friend() phải trả về là FALSE ) hoặc một cách nào khác hay không?
      
    

    83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?