了解c++; 我是C++的新手,也是智能指针。 我有这样的代码 Example* Example::get_instance() { Example* example = new Example(); return example; }

了解c++; 我是C++的新手,也是智能指针。 我有这样的代码 Example* Example::get_instance() { Example* example = new Example(); return example; },c++,C++,我试着把它转换成这样的智能指针 shared_ptr<Example> Example::get_instance() { shared_ptr<Example> example (new Example()); return example; } shared_ptr示例::get_实例(){ 共享的ptr示例(新示例()); 返回示例; } 这是正确的方法吗?因为当我试图从另一个类调用它时,它不起作用。我试图实现一个单例对象。每次请

我试着把它转换成这样的智能指针

shared_ptr<Example> Example::get_instance() {
        shared_ptr<Example> example (new Example());
        return example;
}
shared_ptr示例::get_实例(){
共享的ptr示例(新示例());
返回示例;
}

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

每次请求该对象时,您都在创建一个新的
示例
对象,这是内存泄漏,并且每次都返回一个不同的对象。请尝试以下方法:

Example & Example::get_instance() {
        static Example example;
        return example;
}
另外,请注意以下代码建议:

  • 创建智能指针时,更喜欢
    使_共享
    而不是
    共享_ptr(新的YourType(…)
    。原因可以找到。相关摘录:

    此函数通常为T对象和 具有单个内存分配的共享ptr控制块(它是一个 标准中的非约束性要求)。相反,宣言 std::shared_ptr p(新T(Args…)至少执行两个内存 分配,这可能会导致不必要的开销。此外 如果g 抛出异常。如果共享make_,则不存在此问题 用过

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

  • 通常,当您可以使用引用时,请避免使用指针,因为它们更易于使用,而且代码看起来更干净

  • 最后,你真的想要单身吗?我只是想问问。我已经做了将近4年的全职程序员了。我知道不会太长,但我已经遇到了这样的情况,我后悔自己或其他人使用了单例模式,而不是将引用传递给调用链中的对象
尝试避免使用单例,您可能会在以后发现使用单例的代码可能最终希望处理
Example
对象的多个实例,而不是调用Example::get_instance并仅处理该单个实例。因此,当你得到启示时(这可能只是时间问题),你将面临重大的重构


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

到底什么不起作用?什么不起作用?这绝对不是创造单身的方式。每次调用
get\u instance
都会创建一个新的singleton实例。是的,我理解。我想问的是,我可以像这样返回一个共享指针吗?shared_ptr Example::get_instance(),或者它需要像这样做吗*Example::get_instance(){@Kathick您发布的内容将被编译,但它不会创建一个单例。只有您可以回答这是否适用于您。另外,更喜欢使用
std::make_shared
(或
boost::make_shared
)创建
shared_ptr
实例。或者忘记布尔值和智能指针,在函数中创建对象的静态实例并返回对它的引用(或指针)。在尝试实现单例时,不需要涉及智能指针。true,true:))执行OPs代码,从树上看不到森林。@Zadirion我可以知道你为什么说“让共享而不是共享”吗