2

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

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

4

1 回答 1

1

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...)) 执行至少两次内存分配,这可能会产生不必要的开销。此外,如果 g 抛出异常, f(shared_ptr(new int(42)), g()) 可能会导致内存泄漏。如果使用 make_shared 则不存在此问题。

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

  • 一般来说,当您可以使用引用时避免使用指针,它们更易于使用并且代码看起来更简洁。

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

尽量避免使用单例,稍后您可能会发现使用单例的代码最终可能希望在Example对象的多个实例上工作,而不是调用 Example::get_instance 并且只在该单个实例上工作。因此,当您获得该启示时(这可能只是时间问题),您将面临重大的重构。

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

于 2013-03-18T05:39:24.540 回答