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

时间:2013-03-18 05:34:04

标签: c++

我是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;
}

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

1 个答案:

答案 0 :(得分:1)

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

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

另请注意以下有关您的代码的建议:

  • 创建智能指针时,请选择make_shared而不是shared_ptr<YourType>(new YourType(...))。可以找到原因here。相关摘录:

      

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

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

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

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

尽量避免使用单例,稍后您可能会发现使用单例的代码最终可能需要处理Example对象的多个实例,而不是调用Example :: get_instance而只能处理单个实例。因此,当你有了这个启示时,(并且可能只是时间问题),你将面临重大的重构。

所以,“小心,有龙!”。