草庐IT

shared-libraries

全部标签

c++ - shared_array 的元素作为 shared_ptr?

如果我有一个boost::shared_array(或boost::shared_ptr),有没有办法获得boost::shared_ptr哪个与数组共享?例如,我可能想写:shared_arrayarray(newint[10]);shared_ptrelement=&array[2];我知道我不能使用&array[2],因为它只有类型int*,这对shared_ptr是危险的有一个将采用该类型的隐式构造函数。理想shared_array上面会有一个实例方法,比如:shared_ptrelement=array.shared_ptr_to(2);很遗憾,我找不到这样的东西。share

c++ - shared_ptr 原子函数采用指针而不是引用的基本原理

如你所见here,shared_ptr作为指针而不是引用传递。还要注意Allthesefunctionsinvokeundefinedbehaviorifpisanullpointer.那么为什么是指针呢?我认为在C++中,应该优先使用引用,除非有特定的原因需要使用指针。 最佳答案 templateboolatomic_is_lock_free(conststd::shared_ptr*p);接受一个指向智能指针的指针,因为这是更通用的atomic_is_lock_free的特例:templateboolatomic_is_lock

c++ - 有没有办法更改现有 shared_ptr 实例的删除操作

我有一个函数,我希望在90%的时间内完成清理操作,但在10%的时间内我希望完成一些其他操作。有什么方法可以使用一些标准范围的控件,例如shared_ptr这样一开始它可以有一个删除操作,然后在函数中可以更改删除操作?shared_ptrptr(newT,std::mem_fun_ref(&T::deleteMe));ptr.pn.d=std::mem_fun_ref(&T::queueMe); 最佳答案 不是真的-shared_ptr的标准以这样的方式编写Deleter可以按值存储在控制节点(一个包含引用计数器、保存删除器、跟踪弱指

c++ - 使用 braced-init 初始化 std::shared_ptr<std::map<>>

我有以下shared_ptr到map:std::shared_ptr>我想使用braced-init来初始化它。可能吗?我试过:std::strings1("temp");std::shared_ptr>foo=std::make_shared>(1000.0,s1);但是在使用Xcode6.3编译时出现以下错误:/usr/include/c++/v1/map:853:14:Candidateconstructornotviable:noknownconversionfrom'double'to'constkey_compare'(aka'conststd::__1::less')fo

c++ - 为什么 libcxx 应用 __forceinline 或 GCC 等效于它已经隐藏的内联函数?

我想确切地理解为什么内联函数的libc++可见性宏使用__forceinline或__attribute__((__always_inline__))作为它关联的属性的一部分内联函数。背景见:ThelibcxxvisibilitydesigndocumentThedefinitionofINLINE_VISIBILITY如果这些内联函数无论如何都将被标记为__visibility__("hidden"),为什么还需要额外强制编译器将它们内联?我想了一下,我有一些假设,但似乎没有一个让我完全满意:这是为了确保符号不会意外成为ABI的一部分。如果在构建库时,编译器选择不内联函数,它可能会成

c++ - 如何为 std::shared_ptr<PureVirtualClass> 传递默认参数

我有一个类型的函数virtualvoidfoo(bla,bla,bla,std::shared_ptrlogger)=0;我想传递一个带有NULL指针的默认参数,例如:virtualvoidfoo(bla,bla,bla,std::shared_ptrlogger=NULL)=0;所以在实现中,如果logger是NULL我什么也不做,否则我使用logger。我试图寻找解决方案但找不到..UPD:重复声明无关紧要,我问的是默认NULL参数。有没有可能gcc4.4不支持nullptr? 最佳答案 你可以简单地这样做:virtualvoi

c++ - 可以在不重新编译客户端代码的情况下扩展虚拟接口(interface)吗?

库提供具有虚函数的类。是否可以在不重新编译动态链接到库的二进制文件的情况下使用新的虚函数扩展此类?我相信这在标准中是不可能的。是否有平台允许这样做?如果新函数只添加到类主体的末尾,会不会更容易? 最佳答案 该标准不关心二进制兼容性。它与类有关,并且通过将类的定义从一个翻译单元“更改”为另一个翻译单元,您确实会调用未定义的行为。大多数编译器确实允许在不需要重新编译的情况下进行一些更改,但是列表很小......对于这个我会说这可能是不可能的,取决于先验知识派生类。我预见的问题在于编译器通常对虚拟表进行的优化。当你创建一个带有虚函数的类时

C++ 依赖注入(inject)——通过引用还是通过 boost::shared_ptr?

在需要构造函数依赖注入(inject)的情况下,使用引用注入(inject)与使用boost::shared_ptr注入(inject)有哪些注意事项?还有其他常见的方法吗?它与上述两种方法相比如何? 最佳答案 您可以选择如何管理要注入(inject)的对象的生命周期。整体架构可能会决定哪种选择最有意义。有了引用,更高层次的东西必须管理对象的生命周期;使用shared_ptr将自动管理生命周期。 关于C++依赖注入(inject)——通过引用还是通过boost::shared_ptr?,

c++ - 通过继承扩展 shared_ptr

做这样的事情有什么不好?classmyclass:publicstd::shared_ptr{//somecode,anallocationisneverdonestd::stringget_info(){if(*this!=nullptr)return""+(this->info*3)+"";elsereturn"";}};当类中没有分配时---只是像上面那样提供一些装饰? 最佳答案 原则上允许从STL类派生,参见here和here.但是,您必须知道您不应该使用指向基类的指针——即std::shared_ptr*。在这种情况下。所

c++ - 跨平台 C++ 动态库插件加载器

我只是想知道对于使用共享库动态加载插件的跨平台实现,我有什么选择。到目前为止,我发现的唯一一个是:http://library.gnome.org/devel/glib/stable/glib-Dynamic-Loading-of-Modules.html我只是想知道我是否还有其他选择?本质上,我希望能够将插件放入共享对象文件中,并在运行时加载它们,我希望以跨平台C++方式进行。编辑:我找到这个DrDobbsPost从2007年开始;从那以后肯定有人想出了更多的东西。 最佳答案 你可以看看BoostExtension,尽管它还没有被