Bạn cần phải chắc chắn rằng bạn không khởi tạo cả hai đối tượng shared_ptr với con trỏ liệu giống nhau, hoặc nó sẽ bị xóa hai lần. A (nhưng vẫn xấu) cách tốt hơn để làm điều đó:
classA* raw_ptr = new classA;
shared_ptr<classA> my_ptr(raw_ptr);
// or shared_ptr<classA> my_ptr = raw_ptr;
// ...
shared_ptr<classA> other_ptr(my_ptr);
// or shared_ptr<classA> other_ptr = my_ptr;
// WRONG: shared_ptr<classA> other_ptr(raw_ptr);
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr;
CẢNH BÁO: mã trên cho thấy thực tế xấu! raw_ptr
đơn giản không nên tồn tại dưới dạng biến. Nếu bạn trực tiếp khởi tạo con trỏ thông minh của bạn với kết quả của new
, bạn giảm nguy cơ vô tình khởi tạo các con trỏ thông minh khác một cách không chính xác. Những gì bạn nên làm là:
shared_ptr<classA> my_ptr(new classA);
shared_ptr<classA> other_ptr(my_ptr);
Điều tốt đẹp là mã này ngắn gọn hơn.
EDIT
tôi có lẽ nên xây dựng trên nó như thế nào sẽ làm việc với một bản đồ. Nếu bạn có một con trỏ thô và hai bản đồ, bạn có thể làm một cái gì đó tương tự như những gì tôi đã trình bày ở trên.
unordered_map<string, shared_ptr<classA> > my_map;
unordered_map<string, shared_ptr<classA> > that_guys_map;
shared_ptr<classA> my_ptr(new classA);
my_map.insert(make_pair("oi", my_ptr));
that_guys_map.insert(make_pair("oi", my_ptr));
// or my_map["oi"].reset(my_ptr);
// or my_map["oi"] = my_ptr;
// so many choices!
Không hiển thị con trỏ thô trong biến. Bằng cách đó, bạn cung cấp cho một người duy trì một cơ hội dễ dàng hơn để vít lên và đưa con trỏ RAW vào một con trỏ được chia sẻ khác. Chỉ cần sử dụng 'my_ptr (new ClassA());' Bằng cách đó, người duy trì phải làm thêm công việc để vặn mọi thứ. –
@Martin York Tôi chỉ chỉnh sửa để bao gồm một điểm về điều đó; Tôi sẽ thêm một lưu ý rõ ràng hơn. Nhưng bạn là chính xác. :) – Dawson
'// hoặc shared_ptr my_ptr = raw_ptr;' sai trong 'std :: shared_ptr', vì nó phải rõ ràng là' // hoặc shared_ptr my_ptr (raw_ptr); '. –
Justme0