auto_ptr会在传入的C ++标准中被弃用吗? unique_ptr应该用于所有权转移,而不是shared_ptr? 如果unique_ptr不在标准中,那么我是否需要使用shared_ptr?
Lidström先生和我有一个观点 🙂 Lidström先生的说法是构造shared_ptr<Base> p(new Derived); 不需要Base有一个虚拟析构函数: Armen Tsirunyan :“真的吗? shared_ptr能够正确清理吗?在这种情况下,请您certificate这个效果如何实现? DanielLidström :“ shared_ptr使用自己的析构函数来删除具体的实例,这在C ++社区中被称为RAII,我的build议是你可以学习关于RAII的所有知识,当你使用C ++时, RAII在所有情况下。“ Armen Tsirunyan :“我知道RAII,而且我也知道,当pn达到0时, shared_ptr析构函数最终可能会删除存储的px。但是,如果px具有指向Base静态types指针和指向Deriveddynamictypes指针,则除非Base具有虚拟析构函数,这会导致不确定的行为,如果我错了,纠正我。 DanielLidström :“ shared_ptr知道静态types是Concrete,它知道这个,因为我在构造函数中传递它,看起来有点像魔术,但我可以向你保证它是有devise的,非常好。 所以,评判我们。 怎么可能(如果是的话)实现shared_ptr而不要求多态类具有虚拟析构函数? 提前致谢
我最近在CppCon 2016上观看了Herb Sutter关于“Leak Free C ++ …”的畅谈,他谈到了如何使用智能指针来实现RAII(资源获取是初始化) – 概念以及它们如何解决大部分的内存泄漏问题。 现在我在想。 如果我严格遵循RAII规则,这似乎是一件好事,那么为什么这与C ++中的垃圾收集器有什么不同呢? 我知道,在RAII中,程序员完全控制了资源何时被释放,但是在任何情况下都有利于只有垃圾收集器? 会不会有效率? 我甚至听说有一个垃圾收集器可以更有效率,因为它可以一次释放更大的内存块,而不是释放整个代码中的小内存块。
这是两个部分的问题,所有关于std::shared_ptr的primefaces性: 1.据我所知, std::shared_ptr是<memory>中唯一的智能指针。 我想知道是否有一个非primefaces版本的std::shared_ptr可用(我看不到在<memory>任何东西,所以我也打开了标准以外的build议,如在Boost中的那些)。 我知道boost::shared_ptr也是primefaces的(如果BOOST_SP_DISABLE_THREADS没有定义),但也许有另一种select? 我正在寻找具有与std::shared_ptr相同的语义,但没有primefaces性的东西。 2.我明白为什么std::shared_ptr是primefaces的; 这有点不错 但是,对于每一种情况都不是很好,C ++在历史上的口号是“只为你使用的东西付钱”。 如果我不使用多个线程,或者如果我使用多个线程,但不是在线程之间共享指针所有权,则primefaces智能指针是矫枉过正的。 我的第二个问题是为什么不是在C ++ 11中提供的std::shared_ptr的非primefaces版本 ? (假设有一个为什么 )(如果答案只是“一个非primefaces版本从来没有考虑过”或“没有人要求过一个非primefaces版本”这很好!)。 在问题#2中,我想知道是否有人曾经提出shared_ptr的非primefaces版本(要么提升或标准委员会)(不是取代shared_ptr的primefaces版本,而是与它共存),它被击落出于特定原因。
嗨,我今天问了一个问题, 如何在同一个向量数组中插入不同types的对象 ,我的代码在这个问题是 gate* G[1000]; G[0] = new ANDgate() ; G[1] = new ORgate; //gate is a class inherited by ANDgate and ORgate classes class gate { ….. …… virtual void Run() { //A virtual function } }; class ANDgate :public gate {….. ……. void Run() { //AND version of Run } }; class ORgate […]
我一直在查看Clang的源代码 ,发现这个代码片段: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } 为什么我要std::move一个std::shared_ptr ? 在共享资源上转让所有权有没有意义? 为什么我不这样做呢? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }
几个小时后,我非常沮丧,试图findshared_ptr所在的位置。 我看到的例子都没有显示完整的代码来包含shared_ptr (和working)的头文件。 简单地说std , tr1和<memory>完全没有帮助! 我已经下载提升和所有,但仍然不显示! 有人可以帮助我确切地知道在哪里find它吗? 感谢让我发泄我的挫折! 编辑:我看到我的标题已经改变。 对于那个很抱歉。 所以…这也是因为我不清楚shared_ptr是“C ++版本依赖” – >这就是为什么我没有说明我的环境 – >因此,可能为什么我很难find它。 我正在MSVS2008上工作。 编辑2:我不知道为什么,但我包括[内存]和[boost / tr1 / memory.hpp]和[boost / tr1 / tr1 /内存],而无处不在寻找shared_ptr ..当然,我couldn “T。 感谢所有的答复。
C ++全是关于内存所有权的 又名“ 所有权语义 ” 一块dynamic分配的内存的所有者负责释放该内存。 所以这个问题真的成了谁拥有的记忆。 在C ++中,所有权由一个RAW指针所包含的内部typeslogging,因此在一个好的(IMO)C ++程序中,很less见到从RAW指针传来的RAW指针(因为RAW指针没有推断的所有权,所以我们不能告诉谁拥有记忆,因此没有仔细阅读文件,你不能分辨谁是负责所有权)。 反过来,很less见到存储在一个类中的RAW指针,每个RAW指针都存储在它自己的SMART指针包装器中。 ( 注意:如果你不拥有一个对象,你不应该存储它,因为你不知道什么时候它会超出范围并被销毁。) 所以问题是: 人们遇到什么types的所有权语义? 用什么标准的类来实现这些语义? 什么情况下你觉得他们有用吗? 让我们为每个答案保留一种语义所有权,这样他们可以分别进行投票 概要: 从概念上讲,智能指针是简单的,一个简单的实现很容易。 我曾经见过很多尝试的实现,但是它们总是以某种方式被打破,这对于偶然使用和例子来说并不明显。 因此,我build议从图书馆总是使用经过良好testing的“智能指针”,而不是自己动手。 std :: auto_ptr或其中一个boost智能指针似乎涵盖了我所有的需求。 的std :: auto_ptr的<T>: 一个人拥有这个物体。 但是允许所有权转让。 用法: ====== 这使您可以定义显示所有权的显式转移的接口。 升压:: scoped_ptr的<T> 一个人拥有这个物体。 不允许转让所有权。 用法: ====== 用于显示明确的所有权。 对象将被析构函数销毁或显式重置。 boost :: shared_ptr <T>(std :: tr1 :: shared_ptr <T>) 多重所有权。 这是一个简单的引用计数指针。 当引用计数达到零时,对象被销毁。 用法: ====== […]
我在几篇文章中读到几乎永远不会使用原始指针。 相反,他们应该总是包装在智能指针内,无论是范围还是共享指针。 不过,我注意到像Qt,wxWidgets这样的框架和Boost这样的库不会返回也不会期望智能指针,就好像它们根本不使用它们一样。 相反,他们返回或期待原始指针。 这有什么理由吗? 当我编写公共API时,我应该远离智能指针吗?为什么? 只是想知道为什么在许多重大项目似乎避免使用智能指针。
以下一组指针有什么区别? 什么时候在生产代码中使用每个指针? 例如,将不胜感激! scoped_ptr shared_ptr weak_ptr intrusive_ptr 你在生产代码中使用boost吗?