Con trỏ thông minh cho trẻ em
Các lớp con trỏ thông minh std::unique_ptr
và std::shared_ptr
dành cho quản lý bộ nhớ. Có một con trỏ thông minh như vậy có nghĩa là bạn sở hữu con trỏ. Tuy nhiên, khi tạo một QObject
hoặc một kiểu dẫn xuất với QObject
cha mẹ, quyền sở hữu (trách nhiệm dọn dẹp) sẽ được chuyển giao cho cha mẹ QObject
. Trong trường hợp đó, các con trỏ thông minh của thư viện tiêu chuẩn là không cần thiết, hoặc thậm chí nguy hiểm, vì chúng có thể gây ra việc xóa hai lần. Rất tiếc!
Con trỏ thô đến trẻ mồ côi
Tuy nhiên, khi một QObject
(hoặc kiểu dẫn xuất) được tạo trên heap mà không có cha mẹ thì QObject
mọi thứ sẽ rất khác. Trong trường hợp đó, bạn không nên chỉ giữ một con trỏ thô, mà là một con trỏ thông minh, tốt nhất là một con trỏ std::unique_ptr
tới đối tượng. Bằng cách đó, bạn có được sự an toàn về tài nguyên. Nếu sau này bạn chuyển quyền sở hữu đối tượng cho cha mẹ, QObject
bạn có thể sử dụng std::unique_ptr<T>::release()
, như sau:
auto obj = std::make_unique<MyObject>();
QObject parentObject;
obj->setParent( &parentObject );
obj.release();
Nếu những thứ bạn làm trước khi trao cho đứa trẻ mồ côi cha mẹ của bạn ném ra một ngoại lệ, thì bạn sẽ bị rò rỉ bộ nhớ, nếu bạn sử dụng con trỏ thô để giữ đối tượng. Nhưng đoạn mã trên được lưu lại để chống lại sự rò rỉ như vậy.
Trên một lưu ý chung hơn
Lời khuyên C ++ hiện đại không phải là tránh tất cả các con trỏ thô cùng nhau, mà là tránh sở hữu các con trỏ thô. Tôi có thể thêm một lời khuyên C ++ hiện đại khác: Không sử dụng con trỏ thông minh cho các đối tượng thuộc sở hữu của một số thực thể chương trình khác.