理解c++中的智能指针增强

understanding the smart pointer boost in c++

本文关键字:指针 增强 智能 c++ 理解      更新时间:2023-10-16

我对c++和智能指针都是新手。我有一个这样的代码。

Example* Example::get_instance() {
        Example* example = new Example();
        return example;
}

我正在尝试将其转换为像这样的智能指针

shared_ptr<Example> Example::get_instance() {
        shared_ptr<Example> example (new Example());
        return example;
}

这是正确的方式,因为当我试图从另一个类调用它不工作。我正在尝试实现一个单例对象。

每次请求对象时都创建一个新的Example对象,这是内存泄漏,并且每次也返回不同的对象。试试这个:

Example & Example::get_instance() {
        static Example example;
        return example;
}

还请注意以下对代码的建议:

  • 创建智能指针时更喜欢make_shared而不是shared_ptr<YourType>(new YourType(...))。原因可以在这里找到。相关摘录:

    该函数通常为T对象和Shared_ptr的控制块具有单个内存分配(它是一个标准中不具约束力的要求)。相反,宣言std::shared_ptr p(new T(Args…))至少执行两个内存分配,这可能会产生不必要的开销。此外,F (shared_ptr(new int(42)), g())可能导致内存泄漏抛出异常。这个问题不存在,如果make_shared是使用。

  • 理解std::unique_ptrstd::shared_ptr的区别。对于您的情况,std::unique_ptr会更好,但是有一个更简单的解决方案来解决您的问题,我在上面展示了。

  • 一般来说,当你可以使用引用时避免使用指针,它们更容易使用,代码看起来更干净。

  • 最后,你真的想要一个单例吗?我只是想问一下。作为一名全职程序员,我已经工作了近4年。我知道,时间不长,但足以让我遇到这样的情况:我后悔自己或其他人使用了Singleton模式,而不是在调用链中传递对我的对象的引用。

尽量避免单例,你可能会发现你的代码使用单例可能在最后想工作在多个实例的Example对象,而不是调用Example::get_instance,只工作在单个实例。因此,当您了解到这一点时(这可能只是时间问题),您将面临重大的重构。

所以,"小心,有龙!"