草庐IT

C++智能指针之unique_ptr

全部标签

c++ - 如何上下转换C++智能指针

两个客户端在消息层之上相互通信在消息正文中,我需要包含一个指向任何数据类型的字段我从客户端A发送字段为shared_ptr到消息层。我将此字段定义为shared_ptr在消息层。但是我怎样才能将这个字段转换回shared_ptr在客户B中?或者我应该定义shared_ptr在消息层中作为其他东西?谢谢 最佳答案 如果您使用的是boost::shared_ptr,那么您可以使用各种XXX_ptr_cast()函数(static_ptr_cast、dynamic_ptr_cast...)。如果您使用的是MSVC2010版本,我无法找到这

c++ - 为什么 std::tr1::shared_ptr<>.reset() 如此昂贵?

分析一些大量使用shared_ptrs的代码,我发现reset()的开销出奇地大。例如:structTest{inti;Test(){this->i=0;}Test(inti){this->i=i;}};...autot=make_shared(1);...t.reset(somePointerToATestObject);跟踪最后一行中的reset()(在VC++2010下),我发现它创建了一个新的引用计数对象。有没有更便宜的方法,重用现有的引用计数并且不打扰堆? 最佳答案 在一般情况下,您不能重用现有的引用计数,因为可能有其他s

读十堂极简人工智能课笔记08_人工智能的未来

1. 通用人工智能1.1. 我造不出的东西,我便不明白1.1.1. 物理学家理查德·费曼1.2. 欧文·霍兰德1.2.1. 他的发明中有一个很不寻常的机器人叫作Slugbot,这是一个能“吃”真正的鼻涕虫的机器人,旨在用鼻涕虫腐烂的身体产生动力1.2.2. 其团队造出了CRONOS,一个看起来相当可怕的人形机器人,头部有一只独眼,其解剖结构尽可能地符合人类的骨架1.2.2.1. 其骨头是用塑料生产的,结构相当精巧,足以匹配人类的骨骼1.2.3. 方法是模仿自然,其模仿的深入程度远胜前人在机器人领域的种种尝试1.2.4. 所谓意识就是要让机器人对外部世界形成自己的内部模型,这尽管是它自己想象中的

c++ - 如何将 C++ 引用传递给 C 函数的指针参数?

我只想在这里检查如何将引用传递给需要指针的函数。我在下面有一个代码示例。就我而言,我正在将C++引用传递给将更改我的值的C函数。我是否应该在此调用中使用运算符的“&”地址:retCode=MyCFunc(&myVar)?看来我是引用了引用,这在C++中是不允许的。但是,它编译得很好并且似乎可以工作。MainFunc(){intretCode=0;unsignedlongmyVar=0;retCode=MyCPlusPlusFunc(myVar);//usemyVarsnewvalueforsomechecks......}intMyCPlusPlusFunc(unsignedlong&

c++ - 自动实例化的智能指针

我正在寻找一种减少C++项目中header耦合的简单方法,这主要是由于(过度使用的)类组合,这当然需要完整的类型。例如://headerAclassA{Bb;//requiresheaderB};我也考虑过接口(interface)和pimpl,但是它们都暗示了一些我不想手动编写/支持的样板代码(或者有没有使之自动的方法?)。因此,我考虑过用一个指针和一个类似于classB*pB;的转发替换成员,但这需要处理对象的创建和删除。好的,我可以使用智能指针进行删除(虽然不是auto_ptr,因为它在创建时需要完整的类型,所以要说类似shared_ptrpB;这样的东西),但是现在如何进行对象

c++可能的空指针取消引用

我对一些代码运行了cppcheck以查找可能的运行时错误。并且它报告了以下情况下可能的空指针取消引用:Foo*x=...//definedsomewhere...Foo*y(x);//possiblenullpointerdereference.编辑:更好的例子for(inti=0;i来自cppcheck的错误消息:[C:\file.cpp:3]:(error)Possiblenullpointerdereference:x-otherwiseitisredundanttocheckifxisnullatline4但我不知道这怎么可能。 最佳答案

c++ - 这是在 C++ 中释放指针内存的正确方法吗

这是一个例子,我对它是否是释放指针分配内存的正确方法感到震惊char*functionTest(){char*a=newchar[10];returna;}intmain(){char*b;b=functionTest();delete[]b;return0;}这是一个非常初学者的问题,但仍然想消除我的疑问。从delete编辑到delete[]感谢@sharptooth。提前致谢。 最佳答案 技术上正确的C++(截至此时使用delete[]进行编辑)代码将编译并运行而不会出现错误。然而,在生产C++代码中,您将很少使用new[]和d

c++ - 指向 C++ 中内联 __asm block 的指针

所以我一直在VS2010中使用__asmblock,但我没能找到更好的方法来获取指向汇编block开头的指针。我知道如何做到这一点的唯一方法是声明一个void函数。一个问题是void函数在我的程序集block之前和之后都有自己的程序集,我必须通过获取函数的真实地址并添加偏移量来进行补偿。例子:C++voidmyfunc(){__asm{nopnopnopret}}会产生类似这样的装配:pushebpmovebp,espaddesp,8nopnopnopretnmovesp,ebppopebpretnmyfunc()如果执行,很可能会出错。 最佳答案

c++ - VS 2010 智能感知不适用于上转换项目

我们有一个非常大的C++解决方案,其中包含多个项目,智能感知在VisualStudio2008中完美运行,但在VisualStudio2010中完全不运行(甚至对于在使用它们的同一文件中定义的结构也不行)。我已经验证intellisense在VS2010中确实适用于我机器上的其他项目。我尝试从全新的解决方案中导入其中一个有问题的项目,但没有成功。从头开始重新构建项目文件似乎很有希望,但要遵循这条路径需要数天的工作,并且不能保证最终会成功。欢迎任何替代建议。我得到的实际错误消息是:“Intellisense:‘没有可用的附加信息’(请参阅‘C++项目中的IntelliSense疑难解答’

c++ - 指针或类作为迭代器?

我正在用C++编写一个随机访问容器。在我的代码中我使用这个(好吧,在我的实际代码中我使用各种分配器类型定义,这更容易理解):template>classCarray{public://...typedefT*iterator;typedefconstT*const_iterator;//...};但我也可以创建一个派生自std::iterator的不同迭代器类。这将添加对typedef的支持(it::iterator_category、it::difference_type等)。现在我的问题是,使用迭代器类而不是原始指针是否会产生开销?如果是,这种开销有多大,是否严重到不使用迭代器类的