C ++和智能指针 - 智能指针在这种情况下如何帮助?

时间:2009-09-22 10:21:40

标签: c++ pointers smart-pointers

令我感到羞耻的是,我没有机会在实际开发中使用智能指针(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);

如果我要使用智能指针而不是原始指针,那么这个问题怎么能减轻呢?

3 个答案:

答案 0 :(得分:4)

让你的每个类实现一个析构函数,它执行该类所需的所有清理/取消初始化。

创建该类的实例,并将其包装在boost::shared_ptr

然后将其副本传递给需要访问实例的每个函数。

智能指针将确保一旦不再使用该对象(当所有共享指针都被销毁时),它们指向的对象就会被销毁。运行析构函数,执行所有清理工作。

与C ++一样,尽可能使用RAII。

每当你有x.reset()disconnect(x)这样的代码时,你应该做的第一件事就是问自己“这不属于析构函数吗?”

此外,无论何时使用x->y(),您都应该问自己:

  • 为什么这是一个指针?我无法处理在堆栈上分配的单个实例,也许还有一些对它的引用?
  • 如果必须是指针,为什么它不是智能指针?

答案 1 :(得分:2)

智能指针主要用于管理指向的内存。它们不是什么意思,它可以让你摆脱NULL值检查的负担......

在您的示例代码中,我没有看到智能指针降低代码复杂性的可能性,除非您将videoPlayerWindow_->reset()disconnect(videoPlayerWindow_)之类的调用移动到类的析构函数中,{{ 1}}是。

的实例

答案 2 :(得分:2)

检查NULL不是问题 - 智能指针也不会干扰它。