Tôi đang làm việc với std::shared_ptr
và trong quá trình phát triển phần mềm của mình, tôi đã gặp một số trường hợp cho phép tôi nghi ngờ về quản lý bộ nhớ. Tôi đã có một thư viện của bên thứ ba rằng đã cho tôi luôn luôn con trỏ nguyên từ các chức năng và trong mã của tôi, tôi đã chuyển đổi chúng thành std::shared_ptr
(từ std và không phải từ tăng. Bằng cách nào sự khác biệt giữa hai là gì?). Vì vậy, chúng ta hãy nói rằng tôi có đoạn mã sau:C + + con trỏ thô và tiêu chuẩn :: shared_ptr
ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);
gì xảy ra bây giờ khi con trỏ chia sẻ đi ra khỏi phạm vi (giả sử nó đã được công bố tại địa phương trong một chức năng và bây giờ tôi đang thoát khỏi chức năng). Đối tượng ClassA
vẫn tồn tại vì một con trỏ thô trỏ đến nó?
Chỉ cần đưa ra lý do tại sao: shared_ptr không xem con trỏ thô vì không có cách nào shared_ptr có thể biết về nó. Nếu bạn nghĩ về cách bạn sẽ tự mình thực hiện shared_ptr thì bạn sẽ thấy rằng bạn không thể phát hiện nếu có bất kỳ con trỏ thô nào đến dữ liệu. – Wutz
+1. Ngoài ra, đây là lý do tại sao bạn nên 'new' đối tượng trên cùng một dòng khi bạn tạo' shared_ptr'. Thậm chí tốt hơn, sử dụng ['make_shared'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –
Cảm ơn, trên thực tế, tôi đồng ý rằng không có cách nào để tìm ra nếu một con trỏ thô là chỉ vào đối tượng. Trong trường hợp này, nó chỉ nguy hiểm cho con trỏ thô vì nó sẽ trỏ đến một đối tượng bị hủy vì shared_ptr sẽ phá hủy nó khi nằm ngoài phạm vi – ISTB