Gần đây tôi đã học được các con trỏ được quản lý và chạy vào kịch bản sau đây.C++ shared_ptr của đối tượng chồng
Tôi đang triển khai lớp mô hình/bộ điều khiển cho chế độ xem trò chơi. Quan điểm của tôi, sẽ hiển thị mọi thứ trong mô hình. Khá thẳng về phía trước. Trong chức năng chính của tôi, tôi nhanh chóng cả ba như thế này:
RenderModel m;
m.AddItem(rect); // rect gets added just fine, it's an "entity" derivee
RenderView v;
v.SetModel(m);
tôi render xem lớp khá đơn giản:
class RenderView
{
public:
explicit RenderView();
~RenderView();
void Update();
void SetModel(RenderModel& model);
private:
// disable
RenderView(const RenderView& other);
RenderView& operator=(const RenderView& other);
// private members
boost::scoped_ptr<RenderModel> _model;
};
Việc thực hiện cho setview là khá chuẩn:
void RenderView::SetModel(RenderModel& model)
{
_model.reset(&model);
}
Các chính là, khung nhìn lưu trữ một mô hình trong một con trỏ thông minh. Tuy nhiên trong chính, mô hình được phân bổ trên stack. Khi chương trình thoát, bộ nhớ sẽ bị xóa hai lần. Điều này thật ý nghĩa. Sự hiểu biết hiện tại của tôi cho tôi biết rằng bất cứ thứ gì được lưu trữ trong smart_ptr (dưới bất kỳ hình thức nào) đều không được cấp phát trên ngăn xếp.
Sau khi tất cả các thiết lập ở trên, câu hỏi của tôi rất đơn giản: làm thế nào để tôi ra lệnh rằng một tham số không được cấp phát trên ngăn xếp? Đang chấp nhận một con trỏ thông minh như một tham số giải pháp duy nhất? Thậm chí sau đó tôi không thể đảm bảo rằng một người nào đó sử dụng lớp quan điểm của tôi không thể làm điều gì đó không chính xác như:
// If I implemented SetModel this way:
void RenderView::SetModel(const std::shared_ptr<RenderModel>& model)
{
_model.reset(&*model);
}
RenderModel m;
RenderView v;
std::shared_ptr<RenderModel> ptr(&m); // create a shared_ptr from a stack-object.
v.SetModel(ptr);
Nếu người gọi không hiểu sai shared_ptr, tôi cho rằng không có cách nào để phát hiện một cái gì đó như thế này? Tôi hỏi đơn giản, bởi vì tôi cảm thấy tôi có thể mắc lỗi này lần nữa, và tôi không muốn bỏ ra hàng giờ để gỡ lỗi lại vấn đề. Tôi có thể để lại cho tôi một lưu ý dính trên màn hình của tôi cho đến khi nó cháy vào đầu của tôi ... – Short
Có một số 'thủ thuật' đã biết để phát hiện xem một đối tượng có trong ngăn xếp hay vùng heap hay không, như so sánh địa chỉ. Tất cả các chuyển tiếp trên hành vi phụ thuộc không xác định hoặc thực hiện. Tôi đoán nếu nó chỉ để gợi ý cho mình nó có thể làm việc, nhưng họ không phải là một giải pháp thực sự. –
Không, nếu hàm của bạn có một 'std :: shared_ptr', không có cách nào để biết con trỏ đó trỏ đến một đối tượng hợp lệ hay không. Điều đó nói rằng, nếu nó rõ ràng có một 'std :: shared_ptr', nó khó khăn hơn rất nhiều (mã xây dựng một' std :: shared_ptr' từ một biến cục bộ có vẻ sai ở cái nhìn đầu tiên và dễ tránh). –