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?