草庐IT

my_shared_ptr

全部标签

c++ - shared_ptr 是线程安全的开销是多少?

std::shared_ptr保证是线程安全的。我不知道典型的实现使用什么机制来确保这一点,但它肯定有一些开销。即使您的应用程序是单线程的,这种开销也会存在。是上述情况吗?如果是这样,如果您没有使用线程安全保证,这是否意味着它违反了“您不为未使用的东西付费”的原则? 最佳答案 如果我们检查cppreferencestd::shared_ptr的页面他们在实现说明部分陈述了以下内容:Tosatisfythreadsafetyrequirements,thereferencecountersaretypicallyincremented

c++ - 在 C++ 中将具有 unique_ptr 的对象插入 vector

我有一个简单的类结构来模拟离散模拟,它有一个状态vector,每个状态包含许多转换,作为智能指针vector保存。我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态性。#include#includeclassTransition{public:Transition(){}};classState{public:State(intnum):num(num),transitions(){}voidadd_transition(std::unique_ptrtrans){transitions.push_back(std::move(trans));}private:intnum

c++ - 为什么找不到用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?

我使用的是VisualStudio2015。知道为什么这段代码可以编译:#includeclassFoo;classBar;typedefstd::pair>Object;typedefstd::vectorObjectVect;booloperator==(std::weak_ptrleft,std::weak_ptrright){returnleft.lock()==right.lock();}intmain(intargc,char*argv[]){ObjectVectvect;Objectobj;autofoundIter=std::find(vect.begin(),vect

C++11 传递 'this' 作为 std::make_shared 的参数

我正在尝试使用std::make_shared将“this”传递给构造函数例子://headersclassA{public:std::shared_ptrcreateB();}classB{private:std::shared_ptra;public:B(std::shared_ptr);}//sourcestd::shared_ptrA::createB(){autob=std::make_shared(this);//Compilererror(VS11Beta)autob=std::make_shared(std::shared_ptr(this));//Nocompiler

c++ - boost::shared_ptr 在多线程中使用它安全吗?

一段时间以来我一直试图找到答案,但我失败了。假设我们有一个从一个线程创建的shared_ptr。然后我们将这个shared_ptr传递给另外两个线程(例如使用一些队列)。所以从这一刻起,原始shared_ptr有2个拷贝,指向同一个原始指针。两个所有者线程将从队列中获取此shared_ptr的拷贝。然后他们会将其传递给另一个线程或将其销毁。问题是-它安全吗?原始指针是否会被正确销毁(不会竞争引用计数器?) 最佳答案 C++标准几乎没有关于线程安全的保证。std::shared_ptr的引用计数是唯一的异常(exception):它保

c++ - 将函数标记为虚拟会导致 unique_ptr 出现编译器错误

我有一个包装vector的模板类。我试图在这个类中存储unique_ptrs,它工作正常。但是,当我将voidadd(constT&elem)函数标记为虚拟时,我的编译器(clang)告诉我我正在为unique_ptr进行“调用隐式删除的复制构造函数”。我知道无法复制unique_ptr,所以我创建了voidadd(T&&elem)函数。我只是不知道为什么将另一个add函数标记为virtual会导致编译器错误。感谢您的宝贵时间。#include#include#includeusingnamespacestd;templateclassContainerWrapper{private:

c++ - std::shared_ptr 不适用于范围

我正在尝试在for循环范围内迭代一个临时对象。看起来对象在循环开始执行之前就被取消了。这是标准的合规行为吗?我正在使用gcc4.8。#include#include#includestructTest:std::vector{Test():std::vector{1,2,3}{std::coutfunc(){returnstd::shared_ptr(newTest);}intmain(){for(constauto&obj:*func()){std::cout结果如下:Test::Test()Test::~Test()217703000330003 最佳答

c++ - Boost.Pointer 容器在 C++11/14 中被 std::unique_ptr 淘汰了吗?

是否std::unique_ptr使Boost.PointerContainer库在C++11/14中过时?在C++98/03中没有移动语义,也没有像shared_ptr这样的智能指针。与原始指针相比,具有引用计数相关的开销(对于引用计数block和互锁增量/减量)。所以像std::vector>如果与std::vector相比有开销.但是是std::vector>与std::vector一样高效(没有引用计数开销),和此外安全关于异常和自动销毁(即vector>析构函数将自动调用析构函数对于指针存储在T中的vector项)?如果是这样,Boost.PointerContainer在C

c++ - 对使用 unique_ptr 和自定义删除器感到困惑

我正在尝试使用unique_ptr使用SDL_Surface的自定义删除器类型。这只是一个使用int的示例打字,但我希望你明白了。#include#include#includetypedefintSDL_Surface;SDL_Surface*CreateSurface(){SDL_Surface*p=newSDL_Surface;returnp;}voidFreeSurface(SDL_Surface*p){deletep;}intmain(){std::unique_ptr>uptr_1;//howtoassignavaluetouptr_1andthedeleter?retur

c++ - 使用 std::make_shared 抽象类实例化时出错

我将省略相当多的代码,因为这些是一些相当大的对象,而我的问题实际上只涉及std::make_shared的操作。我在名为D3D11Shader的命名空间SYNC中有一个对象。这有一个名为static的函数,SYNC::D3D11Shader*SYNC::D3D11Shader::CreateInstance(conststd::string&s)它将采用字符串索引并返回指向从SYNC::D3D11Shader派生的着色器实例的指针。有一次我开始使用智能指针在包含所有这些着色器的vector中自动重新分配它们。然而,当我去做这件事时,std::shared_ptrshaderPtr;//