Sho*_*ort 13 c++ heap stack smart-pointers
我最近一直在学习托管指针并遇到以下情况.
我正在为游戏视图实现模型/控制器类.我的观点,将在模型中呈现内容.挺直的.在我的main函数中,我将这三个实例化为:
RenderModel m;
m.AddItem(rect); // rect gets added just fine, it's an "entity" derivee
RenderView v;
v.SetModel(m);
Run Code Online (Sandbox Code Playgroud)
我的渲染视图类非常简单:
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;
};
Run Code Online (Sandbox Code Playgroud)
setView的实现非常标准:
void RenderView::SetModel(RenderModel& model)
{
_model.reset(&model);
}
Run Code Online (Sandbox Code Playgroud)
关键是,视图将模型存储在智能指针中.但是在main中,模型是在堆栈上分配的.程序退出时,内存将被删除两次.这是有道理的.我目前的理解告诉我,任何存储在smart_ptr(任何类型)中的东西都不应该在堆栈上分配.
完成上述所有设置之后,我的问题很简单:如何指示参数未在堆栈上分配?接受智能指针作为参数唯一的解决方案?即使这样,我也无法确保使用我的视图类的人不能做错误的事情,例如:
// 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);
Run Code Online (Sandbox Code Playgroud)
如何指示参数未在堆栈上分配?
是的,要求来电者提供std::shared_ptr<RenderModel>.如果来电者误解了std::shared_ptr,这是来电者的问题,而不是你的问题.
如果您打算RenderView成为特定的唯一所有者RenderModel,请考虑使用该功能std::unique_ptr或std::auto_ptr代替该功能; 这样很明显,调用者在调用函数后不应该保留对象的所有权.
或者,如果RenderModel要复制便宜,请复制它并使用副本:
_model.reset(new RenderModel(model));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8923 次 |
| 最近记录: |