gpt4 book ai didi

c++ - 理解 C++ 中的智能指针提升

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:32 25 4
gpt4 key购买 nike

我是 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 object 每次请求对象时,这就是内存泄漏,并且您每次也返回不同的对象。试试这个:

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

另请注意以下针对您的代码的建议:

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

    This function typically allocates memory for the T object and for the shared_ptr's control block with a single memory allocation (it is a non-binding requirement in the Standard). In contrast, the declaration std::shared_ptr p(new T(Args...)) performs at least two memory allocations, which may incur unnecessary overhead. Moreover, f(shared_ptr(new int(42)), g()) can lead to memory leak if g throws an exception. This problem doesn't exist if make_shared is used.

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

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

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

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

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

关于c++ - 理解 C++ 中的智能指针提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15470348/

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