Xét đoạn mã sau:Về vận hành an toàn liên quan đến con trỏ độc đáo
#include <memory>
struct Foo { std::unique_ptr<Foo> next; };
void f(Foo &foo) { foo = std::move(*foo.next); }
int main() {
Foo foo{};
foo.next = std::make_unique<Foo>();
foo.next->next = std::make_unique<Foo>();
f(foo);
}
Bằng cách foo = std::move(*foo.next);
, foo.next.next
được chuyển đến foo.next
.
Nếu foo.next
không hợp lệ làm bước đầu tiên, đối tượng mà điểm đó có thể bị xóa ngay lập tức. Điều này sẽ dẫn đến việc xóa foo.next.next
, đó là đối tượng mà tôi đang cố di chuyển đến foo.next
.
Tôi khá chắc chắn rằng tôi đang thiếu một cái gì đó trong lý luận của tôi, nhưng tôi không thể tìm ra những gì sai.
Đây có phải là hoạt động an toàn không? Tiêu chuẩn này làm tôi yên tâm về điều đó ở đâu?