我刚刚意识到阅读thispagestd::shared_ptr的构造函数只有一个指针参数不是noexcept。因此以下代码包含可能的内存泄漏:std::shared_ptrp3(newint);原因是可能发生两次分配:调用构造函数之前的第一个shared_ptr构造函数中的第二个(这就是在VS2012中发生的情况)这里有两个问题:如果第二次分配抛出异常,是不是第一次的内存泄漏?如果答案是肯定的:使用std::shared_ptr的正确习惯用法是什么?使用make_shared将第一次分配的所有权授予std::unique_ptr然后转移所有权其他想法? 最佳
这是一个智能指针:std::shared_ptrp(newchar[size])它表示填充了原始二进制文件内容的数组。在(并且仅在之后)整个数组从文件复制到RAM之后,我可以解析它,并在此期间检索一些标题信息(一些第一个dwords)。然后是实际数据。在不提供更多上下文的情况下,将提到的共享指针设置为实际数据开头的新地址对我来说很方便。此地址仍在分配的内存中。但是如何设置才不会丢失呢?一个问题是(是/否):是否可以设置p在不调用数据删除的情况下偏移前一个指针? 最佳答案 是的,这是可能的。您可以使用构造函数8,此引用中的别名构造函数
这个问题在这里已经有了答案:WhatisasmartpointerandwhenshouldIuseone?(14个回答)WhichkindofpointerdoIusewhen?(4个回答)关闭9年前。std::unique_ptr的推荐用途是什么?我发现:Aboutunique_ptrperformances我已经知道了:std::unique_ptr是在C++11中开发的,作为std::auto_ptr的替代品std::unique_ptr没有引用计数并且“拥有”它指向的对象没有std::unique_ptr的复制/分配当我需要一个唯一指针时,std::unique_ptr是转到
在下面的代码中,while(!Ref.expired());被愉快地优化为无限循环。如果代码行改为while(!Ref.lock());。一切都按预期工作。所以真的有两个问题:1)当std::weak_ptr::expired()访问内存隔离计数器时,编译器如何优化过期?2)Ref.lock()真的安全吗,或者这也可以优化掉?下面的示例代码。#include#include#include#includeclassA{public:A(){m_SomePtr=std::make_shared(false);}virtual~A(){std::weak_ptrRef=m_SomePtr;
这个问题在这里已经有了答案:Whydostd::shared_ptrwork(6个回答)关闭3年前。我写了下面的代码来看看shared_ptr当它是对shared_ptr的最后一次引用时会运行并且本身就被摧毁了。#include#include#includeusingnamespacestd;structThing{~Thing(){coutvoidPtr;{shared_ptrthingPtr=make_shared();voidPtr=thingPtr;}cout哪些输出:thingPtrisdeadDestroyedvoidPtrisdead它的行为方式我喜欢,但这完全出乎意料
Arecentquestion(尤其是我的回答)让我想知道:在C++11(和更新的标准)中,析构函数总是隐式的noexcept,除非另有说明(即noexcept(false))。在这种情况下,这些析构函数可以合法地抛出异常。(请注意,这仍然是一种你应该真正知道自己在做什么——那种情况!)然而,所有的重载std::unique_ptr::reset()被声明为始终为noexcept(见cppreference),即使析构函数ifT不是,如果析构函数在reset()期间抛出异常,将导致程序终止.类似情况适用于std::shared_ptr::reset().为什么是reset()总是noe
在C++标准草案(N3485)中,它声明如下:20.7.1.2.4unique_ptr观察者[unique.ptr.single.observers]typenameadd_lvalue_reference::typeoperator*()const;1Requires:get()!=nullptr.2Returns:*get().pointeroperator->()constnoexcept;3Requires:get()!=nullptr.4Returns:get().5Note:usetypicallyrequiresthatTbeacompletetype.你可以看到oper
我正试图围绕C++11的新习语展开思考。似乎至少使用shared_ptr与使用newT()之间存在实质性区别和make_shared().但是如何重置共享指针以指向某事物的新实例。以前,我通常会使用reset(newT())成员。但是,这不会遇到与一开始不使用make_shared()相同的问题吗?(即它不允许make_shared分配对象,因此它被迫将引用计数放在单独的分配中,而不是与T本身在同一分配中?)继续使用会不会更好:mysharedptr=make_shared(args...);或者有没有更好的方法?并且不应该像make_shared那样重置提供参数的可变参数转发,以便可
我不确定初始化作为类成员的shared_ptr的好方法。你能告诉我,我在C::foo()中选择的方式是否很好,或者有没有更好的解决方案?classA{public:A();};classB{public:B(A*pa);};classC{boost::shared_ptrmA;boost::shared_ptrmB;voidfoo();};voidC::foo(){A*pa=newA;mA=boost::shared_ptr(pa);B*pB=newB(pa);mB=boost::shared_ptr(pb);} 最佳答案 您的代码
在互联网上对此进行研究后,我无法让Eclipse索引器从GCC4.4.4附带的C++0x添加中解析“shared_ptr”。我确保使用Eclipse的正确包含创建我的项目,所以它肯定在4.4.4包含文件夹中查找。程序编译并运行良好。要访问shared_ptr,我正在使用“#include”。知道是什么破坏了索引器吗? 最佳答案 您需要将预处理器符号“__GXX_EXPERIMENTAL_CXX0X__”设置为Eclipse项目。g++会在您使用'-std=c++0x'时自动添加,但eclipse不知道这一点,因此它将相关header