gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:03 26 4
gpt4 key购买 nike

很遗憾,我在实际开发中一直没有机会使用智能指针(主管认为它太“复杂”,浪费时间)。但是,我打算将它们用于我自己的东西......

我遇到过在模块完成后或在加载新数据时取消初始化模块的情况。当我使用指针时,我发现我的代码乱七八糟地检查 null,例如这样...

// 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);

如果我要使用智能指针而不是原始指针,如何缓解这个问题?

最佳答案

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

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

然后将其拷贝传递给需要访问该实例的每个函数。

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

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

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

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

  • 为什么这是一个指针?难道我不能凑合使用在堆栈上分配的单个实例,也许还有一些对它的引用吗?
  • 如果它必须是一个指针,为什么它不是一个智能指针?

关于C++ 和智能指针——智能指针在这种情况下有何帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1459257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com