令我感到羞耻的是,我没有机会在实际开发中使用智能指针(supervisior认为它太“复杂”而浪费时间)。但是,我计划将它们用于我自己的东西......
我有关于在模块完成后或在加载新数据时取消启动模块的情况。当我使用指针时,我发现我的代码乱七八糟,检查是否为空...
// TODO: Reset all opened windows
// Deinit track result player
if (trackResultPlayer_)
trackResultPlayer_->reset();
// disconnect track result player
disconnect(trackResultPlayer_);
disconnect(trackResultAnimator_);
}
if (videoPlayerWindow_)
{
videoPlayerWindow_->reset();
// Disconnect the video player window from source movie data
disconnect(videoPlayerWindow_);
}
// Disconnect this module from its children as they would be connected again
disconnect(this);
如果我要使用智能指针而不是原始指针,那么这个问题怎么能减轻呢?
答案 0 :(得分:4)
让你的每个类实现一个析构函数,它执行该类所需的所有清理/取消初始化。
创建该类的实例,并将其包装在boost::shared_ptr
。
然后将其副本传递给需要访问实例的每个函数。
智能指针将确保一旦不再使用该对象(当所有共享指针都被销毁时),它们指向的对象就会被销毁。运行析构函数,执行所有清理工作。
与C ++一样,尽可能使用RAII。
每当你有x.reset()
或disconnect(x)
这样的代码时,你应该做的第一件事就是问自己“这不属于析构函数吗?”
此外,无论何时使用x->y()
,您都应该问自己:
答案 1 :(得分:2)
智能指针主要用于管理指向的内存。它们不是什么意思,它可以让你摆脱NULL值检查的负担......
在您的示例代码中,我没有看到智能指针降低代码复杂性的可能性,除非您将videoPlayerWindow_->reset()
,disconnect(videoPlayerWindow_)
之类的调用移动到类的析构函数中,{{ 1}}是。
答案 2 :(得分:2)
检查NULL不是问题 - 智能指针也不会干扰它。