草庐IT

pimpl_ptr

全部标签

c++ - std::weak_ptr:锁或 shared_ptr 构造函数?

似乎有两种方法可以暂时获取weak_ptr指向的资源的所有权:使用lock()将weak_ptr传递给shared_ptr构造函数这两者都会产生一个shared_ptr,如果weak_ptr为空并且锁返回一个nullptrshared_ptr构造函数抛出异常。所以问题是:什么时候应该使用一个或另一个?是否有与此相关的一般准则或最佳做法? 最佳答案 复制自http://en.cppreference.com/w/cpp/memory/weak_ptr/lockBoththisfunctionandtheconstructorofstd

c++ - std::exception_ptr 线程安全吗?

我有一个工作线程,它通过std::thread持续运行、创建和管理。在我的工作线程的顶层,我有一个try/catchblock,里面有一个while循环。如果异常泄漏到线程的顶层,我会捕获它并将其存储在std::exception_ptr中,它是还拥有非静态线程函数的类的成员://Inclassheader(insideclassdeclaration)std::exception_ptrm_threadException;//InclassCPPfilevoidMyClass::MyThreadFunction(){try{while(true){//Dothreadstuff}}c

C++ 惯用法之 PIMPL

一、背景1.概述PIMPL是C++中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问。2.二进制兼容性(1)概述二进制兼容是指当库文件升级后所有使用该库的应用程序不必重新编译,其本质就是类的内存布局不变。使用pimpl方法设计类可以实现二进制兼容的目的。(2)类成员更改后的内存布局原始类定义:classdemoClass{private:inta;intb;};内存布局如下:类更改后的定义:classdemoClass{private:charc;inta;intb;};内存布局如下:(3)pimpl下类的内存布局classdemoClas

c++ - 将对象传递给期望 shared_ptr 的函数而不实际共享所有权

首先,我确实意识到这完全违背了shared_ptr的目的。我正在处理一些库代码,其中ParticleSystem的实例希望在构造期间将shared_ptr传递给它们以设置用于每个粒子的纹理。问题是,我已经以我的纹理具有具体所有权(如果这是正确的术语)的方式构建了我的程序的其余部分-TextureCache拥有所有纹理。所以我需要一种方法来使用这个ParticleSystem类,而不允许它删除我的纹理。如果我只是创建一个像ParticleSystem(std::shared_ptr&myTexture)这样的新实例然后它会在纹理被破坏时尝试破坏它(这是一个不需要的和无效的操作,因为我的纹

c++ - 优化编译器能否从 std::unique_ptr 中移除所有运行时成本?

阅读关于std::unique_ptr的http://en.cppreference.com/w/cpp/memory/unique_ptr,我天真的印象是,一个足够聪明的编译器可以用裸指针替换unique_ptr的正确使用,并在unique_ptr时放入一个delete被摧毁。事实真的如此吗?如果是这样,是否有任何主流优化编译器真的这样做了?如果不是,是否可以编写一些具有unique_ptr的部分/全部编译时安全优势的东西,可以优化为没有运行时成本(空间或时间)?注意那些(适本地)担心过早优化的人:这里的答案不会阻止我使用std::unique_ptr,我只是好奇它是一个非常棒的工具

c++ - std::unique_ptr::release() 与 std::move()

我有一个表示运行时上下文并构建树的类,树根保存在unique_ptr中。构建树完成后,我想提取树。这是它的样子(不可运行,这不是调试问题):classContext{private:std::unique_ptrroot{newNode{}};public://imagineaconstructor,attributesandmethodstobuildatreestd::unique_ptrextractTree(){returnstd::move(this->root);}};所以我使用std::move()从Context实例中提取根节点。但是,除了使用std::move()之外

c++ - shared_ptr 的基本语法问题

我是shared_ptr的新手。我有几个关于C++0xshared_ptr语法的问题如下://firstquestionshared_ptrptr(newclassA());//worksshared_ptrptr;ptr=??//howcouldIcreateanewobjecttoassignittosharedpointer?//secondquestionshared_ptrptr2;//couldbetestedforNULLfromtheifstatementbelowshared_ptrptr3(newclassA());ptr3=??//howcouldIassignN

c++ - boost::ptr_container 和 std::vector<shared_ptr>

看完timdaysanswer至thisquestion我很好奇boost::ptr_container之间的区别和一个std::vector.我的印象是aboost::ptr_containerhadownershipoverthepointersgiventoit,并且在释放时将调用它包含的所有指针的析构函数,而不管对其居民的其他引用。这与std::vector的目的相反,如果引用计数为0,释放后只会释放指针本身?如果是这种情况(我假设不是),为什么甚至Boost文档示例comparethetwo好像它们的目的相似,为什么timday的回答会提出boost::ptr_contain

c++ - 尝试制作 shared_ptr 时 std::make_shared() 出错?

(使用VisualStudio2010)我试图在我的项目中创建一个现有类的shared_ptr(类是在std::shared_ptr存在十年之前编写的)。这个类接受一个指向另一个对象的非常量指针,它的空参数构造函数是私有(private)的。classFoobar{public:Foobar(Baz*rBaz);private:Foobar();}当我尝试为它创建一个shared_ptr时,事情并不顺利:Baz*myBaz=newBaz();std::shared_ptrsharedFoo=std::make_shared(newFoobar(myBaz));在VS2010上,这给了我

c++ - 将 "this"称为 shared_ptr?

这个问题在这里已经有了答案:std::shared_ptrofthis(2个答案)关闭8年前。我正在学习C++11特性,特别是shared_ptr,我在引用this并将其用作其他类的引用时遇到问题.这样做的原因是我有一个Simulation实例,该实例被传递给模拟中的其他实例(例如Apple),因此它们可以自己修改模拟,甚至将自己从模拟中移除。在我更复杂的代码中,我得到了一个doublefree错误(当程序存在时),据我所知fromhere我不应该在同一个原始对象上创建两次shared_ptr。当模拟类不知道this时,如何将this作为shared_ptr传递给Apple对象已经是s