草庐IT

C++智能指针之unique_ptr

全部标签

c++ - 检查函数指针是否被注册

上下文(C++11)作为一段序列化代码中安全措施的一部分,我想检查函数指针是否已知。(否则,反序列化机制可能会失败)。这是一段(简化的)代码,说明了该机制:templatestructFunctionCallRegistry{staticstd::unordered_map&FunctionMap(){staticstd::unordered_mapmap;returnmap;}staticvoidRegister(Funfunction,std::stringname){auto&map=FunctionMap();autoit=map.find(function);if(it==m

c++ - 标记为可能丢失 block 的静态指针是否损坏?

在阅读了有关Valgrind的“可能丢失”block消息后,它们似乎很糟糕。我收到静态指针类成员的错误。我想验证我们的代码没有任何问题。我从Valgrind得到这个:==27986==76bytesin1blocksarepossiblylostinlossrecord370of1,143==27986==at0x4C247F0:operatornew(unsignedlong)(vg_replace_malloc.c:319)==27986==by0x107CFEE8:std::string::_Rep::_S_create(unsignedlong,unsignedlong,std

c++ - 为什么要在函数指针或返回函数指针的函数编译之前放几十个*?

我发现这段处理多个函数指针取消引用的代码意外编译,尽管看起来无效。这怎么能编译?它是编译器中的错误吗?我在Ubuntu14.04上使用gcc4.8.2。intaddInt(intn,intm)//function{returnn+m;}int(*(*functionFactoryPtr)(intn))(int,int);//pointerint(*(functionFactory)(intn))(int,int)//function{std::cout 最佳答案 函数左值可以隐式转换为指向函数的指针([conv.func])。在您的

c++ - 将指针转换为整数是否定义了指针的总顺序?

(与mypreviousquestion相关)在QT中,QMapdocumentation说:ThekeytypeofaQMapmustprovideoperatorspecifyingatotalorder.然而,在qmap.h,他们似乎使用类似于std::less的东西比较指针:/*QMapusesqMapLessThanKey()tocomparekeys.ThedefaultimplementationusesoperatorinlineboolqMapLessThanKey(constKey&key1,constKey&key2){returnkey1inlineboolqM

c++ - 将具有 unique_ptr 的类的构造函数作为成员复制到抽象类

我有一个类(C),它有一个vector的unique_ptr到一个抽象类(A)作为成员(member)。这是因为C必须与A类型的所有类一起工作,即它的子类。问题是我不知道如何为C编写复制构造函数,因为指针指向的对象的类型在编译时是未知的。在我看来这实际上是不可能的。任何人都可以确认这是不可能的吗?你对如何解决这个问题有什么建议吗?有一个没有复制构造函数的类是不是太糟糕了? 最佳答案 你没有说你是否控制抽象类和从它派生的类的代码。如果这样做,那么最简单的方法是在抽象类中提供一个纯虚方法Clone并在派生类中实现它。此方法应处理创建正确

c++ - C/C++ : What's faster: a for loop, 或递增指针

我想知道以下哪个代码段最快,假设目标是从T类型的元素中读取数量为numElements的somePointer并用它们做一些事情。我特别感兴趣的是循环结构本身的效率,而不是对元素所做的事情。第一候选人for(inti=0;i第二个候选人T*tempPointer=somePointer;T*endPointer=somePointer+numElements;while(tempPointer当然,第一个候选人更清晰,更不容易出错。但是,如果它实际上被编译成它似乎会生成的代码,我认为它会更慢。使用for循环需要在每次循环迭代时增加i,以及从somePointer指向的地址偏移>i*si

c++ - 多线程的 shared_ptr 销毁是否安全?

我有两个类似的类:classFoo{public:voidbar(){std::lock_guardlock(m_mutex);m_data.push_back('x');}private:std::stringm_data;std::mutexm_mutex;};classPool{public:staticstd::shared_ptrCreate(intindex){std::lock_guardlock(m_mutex);if(m_pool.size()>10){m_pool.erase(m_pool.begin());}std::shared_ptr&ptr=m_pool[i

c++ - 在 C++ 中防止整数 0 隐式转换为指针的最佳方法是什么

我正在尝试找出防止整数0隐式转换为nullptr_t然后传递给采用指针的构造函数的最佳方法。Explicit不会这样做,但我可以让nullptr_t导致模棱两可的重载错误:#includestructA{explicitA(char*){}};structB{B(nullptr_ta)=delete;B(char*){}};intmain(intargc,char*argv[]){Aa(0);//darnitIcompiled...Bb1(0);//good,fails,butwithonlyb/cambiguousBb2((char*)0);//good,succeedsBb3(1)

c++ - 用指向实例中方法的指针替换参数中的静态函数指针

我使用的第三方库需要将指向静态函数的指针作为回调参数传递。现在我必须做这样的事情:staticintMyCallback(...){//Callbackcodehere...}intmain(intargc,char*argv[]){ThirdPartyFunction(&MyCallback,...);}我想做的是用C++类实例的成员方法替换我必须提供的静态回调函数。像这样:classMyClass{public:intMyCallbackMethod(...);};intmain(intargc,char*argv[]){MyClassinstanceOfMyClass;Third

c++ - 在构造函数中引用此指针

Followingisanotherexampleofforwarddeclaration,whichmightbeusefuliftheapplicationneedsaself-sustainingarrayofobjectswhichisabletoaddandremoveobjectsfromitselfduringrun-time:Filea.h:classA{public:staticA*first,*last;A*previous,*next;A();~A();};Filea.cpp:#include"a.h"A*A::first=0,*A::last=0;//don't