c ++堆栈对象的shared_ptr

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)

Jam*_*lis 8

如何指示参数未在堆栈上分配?

是的,要求来电者提供std::shared_ptr<RenderModel>.如果来电者误解了std::shared_ptr,这是来电者的问题,而不是你的问题.

如果您打算RenderView成为特定的唯一所有者RenderModel,请考虑使用该功能std::unique_ptrstd::auto_ptr代替该功能; 这样很明显,调用者在调用函数后不应该保留对象的所有权.

或者,如果RenderModel要复制便宜,请复制它并使用副本:

_model.reset(new RenderModel(model));
Run Code Online (Sandbox Code Playgroud)

  • 不,如果您的函数采用`std :: shared_ptr`,则无法判断该指针是否指向有效对象.也就是说,如果它明确地采用了`std :: shared_ptr`,那么搞砸是很困难的(从局部变量构造`std :: shared_ptr`的代码乍一看看是错误的并且很容易避免). (3认同)