Để giải quyết một vấn đề rất đặc biệt trong ứng dụng của tôi, tôi cần một con trỏ được chia sẻ để phân bổ dữ liệu, nhưng với thế giới bên ngoài, kiểu dữ liệu cơ bản sẽ vẫn ẩn.Con trỏ void chia sẻ. Tại sao điều này hoạt động?
tôi có thể giải quyết việc này bằng cách làm cho một số loại lớp gốc trong đó tất cả các lớp học khác của tôi kế thừa, và sử dụng một shared_ptr trên lớp gốc này, như thế này:
std::shared_ptr<Root>
Tuy nhiên:
- Tôi không muốn tất cả các lớp của tôi thừa kế từ lớp Gốc này chỉ để có thể có con trỏ được chia sẻ này
- Đôi khi tôi muốn trả về con trỏ được chia sẻ thành std :: vector hoặc std :: list hoặc std :: thiết lập, ... mà rõ ràng là không kế thừa từ lớp gốc của tôi
Strange đủ, có vẻ như bạn có thể tạo một shared_ptr vào khoảng trống và điều này dường như làm việc một cách chính xác, như thể hiện trong ví dụ này:
class X
{
public:
X() {std::cout << "X::ctor" << std::endl;}
virtual ~X() {std::cout << "X::dtor" << std::endl;}
};
typedef std::shared_ptr<void> SharedVoidPointer;
int main()
{
X *x = new X();
SharedVoidPointer sp1(x);
}
x sẽ bị xóa một cách chính xác và trong một thí nghiệm lớn hơn tôi có thể xác minh rằng con trỏ chia sẻ thực sự là những gì nó cần làm (xóa x afer shared_ptr cuối cùng biến ra ánh sáng).
Tất nhiên điều này giải quyết được vấn đề của tôi, vì bây giờ tôi có thể trả về dữ liệu với một thành viên dữ liệu SharedVoidPointer và chắc chắn rằng nó được dọn dẹp đúng nơi cần thiết.
Nhưng điều này có được đảm bảo hoạt động trong mọi trường hợp không? Nó hoạt động rõ ràng trong Visual Studio 2010, nhưng điều này cũng hoạt động chính xác trên các trình biên dịch khác? Trên các nền tảng khác?
bản sao có thể có của [cách tăng :: ~ shared_ptr hoạt động?] (Http://stackoverflow.com/questions/4560372/how-boostshared-ptr-works) –
@Charles, Câu hỏi có vẻ tương tự, nhưng trong câu hỏi của tôi Tôi rõ ràng yêu cầu tránh void-con trỏ (không trỏ đến một lớp cơ sở), và cho dù điều này được đảm bảo bởi các tiêu chuẩn (không phải lý do tại sao nó hoạt động trong Tăng). – Patrick
@Patrick: Đó chính là vấn đề tương tự. Deleter được xây dựng khi con trỏ thông minh có quyền sở hữu con trỏ tại thời điểm mà thông tin kiểu tĩnh của con trỏ mà bạn truyền vào được sử dụng để tạo ra deleter. –