Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该为我的应用程序和库使用智能指针吗?_C++_Pointers_C++11_Shared Ptr_Smart Pointers - Fatal编程技术网

C++ 我应该为我的应用程序和库使用智能指针吗?

C++ 我应该为我的应用程序和库使用智能指针吗?,c++,pointers,c++11,shared-ptr,smart-pointers,C++,Pointers,C++11,Shared Ptr,Smart Pointers,关于智能指针的文献太多了,我已经尽可能多地阅读了。我只想要一个简单的答案 我已经将原始指针用于我的3D渲染器引擎,现在我必须在渲染器之间共享一些小部件,所以智能指针出现了。请指导我是否应该使用智能指针(std::shared_ptr)更新我的整个软件/库?在这种情况下有什么缺点?我知道优点,只是想知道有缺点吗?在从原始指针到智能指针的转换过程中,我应该考虑哪些重要的事情?请具体点?谢谢。一般来说,它们是一个有用的工具,但并非所有任务都适用于单个工具。也就是说,您应该考虑以下几点: 学习智能指针

关于智能指针的文献太多了,我已经尽可能多地阅读了。我只想要一个简单的答案


我已经将原始指针用于我的3D渲染器引擎,现在我必须在渲染器之间共享一些小部件,所以智能指针出现了。请指导我是否应该使用智能指针(std::shared_ptr)更新我的整个软件/库?在这种情况下有什么缺点?我知道优点,只是想知道有缺点吗?在从原始指针到智能指针的转换过程中,我应该考虑哪些重要的事情?请具体点?谢谢。

一般来说,它们是一个有用的工具,但并非所有任务都适用于单个工具。也就是说,您应该考虑以下几点:

  • 学习智能指针是一项宝贵的技能。了解它们是在适当的时候应用它们的基础,而在少数情况下则忽略它们
  • 智能指针不仅仅是
    std::shared\u ptr
    。还有
    std::unique\u ptr
    std::make_shared
    std::make_unique
    (C++14)和
    std::至少从该
    启用共享
  • std::shared_ptr
    作为参数传递时,请确保不要添加同步的、多余的引用计数操作,例如,使用
    const std::shared_ptr&
  • 即使标准化的智能指针不是正确的工具,也要知道它们是如何工作的,并创建自己的RAII包装器——仍然比成熟的、容易出错的原始指针要好
  • 在与现有的C风格API接口时,您仍然可以经常使用智能指针,并且只在需要时使用智能指针上的
    .get()
    将原始指针传递给这些API

一般来说,它们是一个有用的工具,但并非所有任务都适用于单个工具。也就是说,您应该考虑以下几点:

  • 学习智能指针是一项宝贵的技能。了解它们是在适当的时候应用它们的基础,而在少数情况下则忽略它们
  • 智能指针不仅仅是
    std::shared\u ptr
    。还有
    std::unique\u ptr
    std::make_shared
    std::make_unique
    (C++14)和
    std::至少从该
    启用共享
  • std::shared_ptr
    作为参数传递时,请确保不要添加同步的、多余的引用计数操作,例如,使用
    const std::shared_ptr&
  • 即使标准化的智能指针不是正确的工具,也要知道它们是如何工作的,并创建自己的RAII包装器——仍然比成熟的、容易出错的原始指针要好
  • 在与现有的C风格API接口时,您仍然可以经常使用智能指针,并且只在需要时使用智能指针上的
    .get()
    将原始指针传递给这些API

关于智能指针的优点还有很多要说的,正如其他人已经说过的,我建议在适当的情况下在应用程序中使用它们


说到库的API,我会说:这要看情况而定。如果您是以源代码形式分发库,那么是的,您可以在API中使用智能指针,您的用户可能会从中受益。但是,如果您希望将库作为DLL分发,则智能指针不是合适的工具。这是因为它们被定义为模板,模板类不能作为DLL分发。库的用户将被迫使用与生成DLL完全相同的编译器和模板库,而这可能不是您想要的。因此,对于DLL的API,在使用智能指针之前,我会三思而后行。

关于智能指针的优点有很多要说的,正如其他人已经说过的,我建议在适当的情况下在应用程序中使用它们


说到库的API,我会说:这要看情况而定。如果您是以源代码形式分发库,那么是的,您可以在API中使用智能指针,您的用户可能会从中受益。但是,如果您希望将库作为DLL分发,则智能指针不是合适的工具。这是因为它们被定义为模板,模板类不能作为DLL分发。库的用户将被迫使用与生成DLL完全相同的编译器和模板库,而这可能不是您想要的。因此,对于DLL的API,在使用智能指针之前,我会三思而后行。

简单的答案是:是的。每当您使用动态分配的对象时,智能指针将使避免内存泄漏或悬空指针错误变得更容易避免,而运行时开销很少(对于共享的\u ptr)或没有(对于唯一的\u ptr)。您的意思是唯一的\u ptr比共享的\u ptr好?唯一的\u ptr效率更高(并且通常会得到完全优化),但共享的ptr功能更强。使用unique_ptr尽你所能,然后使用shared_ptr处理剩下的任何内容。不要在没有充分理由的情况下使用原始指针。即使只是考虑使用哪种智能指针类型,也会迫使您考虑所有权,这对于构建健壮的系统非常重要。简单的答案是:是的。每当您使用动态分配的对象时,智能指针将使避免内存泄漏或悬空指针错误变得更容易避免,而运行时开销很少(对于共享的\u ptr)或没有(对于唯一的\u ptr)。您的意思是唯一的\u ptr比共享的\u ptr好?唯一的\u ptr效率更高(并且通常会得到完全优化),但共享的ptr功能更强。使用unique_ptr尽你所能,然后使用shared_ptr处理剩下的任何内容。不要在没有充分理由的情况下使用原始指针。即使只是考虑使用哪种智能指针类型,也会迫使您考虑所有权,这对于构建健壮的系统非常重要。谢谢