草庐IT

Shared-Preferences

全部标签

c++ - 为什么 std::shared_ptr 取消引用不抛出空指针异常(或类似异常)?

异常是C++的重要组成部分,使用它的原因之一(我知道还有很多更重要的其他原因)是为了避免使用大量if混淆代码的不必要的检查>陈述(也许这是一个不正确的假设?)。所以现在我很好奇为什么std::shared_ptr::operator*和std::shared_ptr::operator->不抛出null_ptr_exception或类似的? 最佳答案 我的理解是,智能指针类的设计看起来和行为都像原始指针。鉴于此指导设计原则,理想情况下,遗留代码可以使用等效所有权语义简单地将原始指针的使用替换为智能指针,并且代码将像以前一样工作。因此

c++ - shared_ptr 在 if 条件下如何工作

在C++中,我可以这样写:shared_ptra_sp=someFunctionReturningSharedPtr();if(a_sp){coutsomeData为什么if(a_sp)检查工作正常?a_sp不是bool值,但如何检查它是真还是假?if条件如何知道检查a_sp.get()函数的结果?或者,如果没有,如何检查a_sp的NULL性?shared_ptr中是否定义了一些将其转换为bool值的函数? 最佳答案 shared_ptr有一个operatorunspecified-bool-type()const允许它在bool上

c++ - std::make_shared 构造函数中的参数个数

在VisualStudio2010/2011中缺少可变参数模板(仍然!),采用大量参数的构造函数可能会出现问题。例如,以下不会编译:MyMaterials.push_back(std::make_shared(MyFacade,name,ambient,diffuse,specular,emissive,opacity,shininess,shininessStrength,reflectivity,bumpScaling,maps,mapFlags));,因为它有13个参数,我认为make_shared仅限于arg0到arg9。明显的解决方法是两部分构造,但我希望避免这种情况。除了使

c++ - boost::shared_ptr 和继承

我面临这样一种情况,我有一个基类的boost::shared_ptr的std::vector。在我的程序过程中,我也需要在该vector中存储指向派生类对象的共享指针,并且在程序稍后的某个时间,需要检索这些共享指针。以下代码说明了我的问题:#include#includeusingnamespacestd;#include#includeclassBase{public:virtual~Base(){}};/******************************************/typedefboost::shared_ptrBasePtr;/**************

c++ - `std::make_shared<POD>()` 值是否初始化我的 POD?

是否std::make_shared()值初始化我的POD?如果是,这是标准保证的吗?如果不是(正如我怀疑的那样),有没有办法做到这一点?我猜std::make_shared(POD())会做,但这是我应该做的吗? 最佳答案 是的,它是值初始化的,这是由标准保证的:§20.7.2.2.6,2:(关于make_shared)Effects:AllocatesmemorysuitableforanobjectoftypeTandconstructsanobjectinthatmemoryviatheplacementnewexpress

C++ shared_mutex 实现

boost::shared_mutex或std::shared_mutex(C++17)可用于单个写入器、多个读取器访问。作为一项教育练习,我整理了一个使用自旋锁并具有其他限制(例如公平策略)的简单实现,但显然不打算在实际应用程序中使用。这个想法是互斥锁保持一个引用计数,如果没有线程持有锁,该引用计数为零。如果>0,则该值表示具有访问权限的读者数。如果为-1,则表示单个作者具有访问权限。这是没有数据竞争的正确实现(特别是使用的最小内存排序)吗?#includeclassmy_shared_mutex{std::atomicrefcount{0};public:voidlock()//w

Android NDK 构建 - 包括 LOCAL_SHARED_LIBRARIES?

我在AndroidNDK下构建项目时遇到问题。很可能是由于未包含适当的共享/静态库。我添加了-lsomeLib的那些,但似乎没有包含LOCAL_SHARED_LIBRARIES的那些......我的Android.mk包含以下内容LOCAL_SHARED_LIBRARIES+=libutilslibmedialibzlibbinderndk-build实际上在哪里寻找这些库?如果我不包括-lutils-lmedia-lz-lbinder,我什至无法得到链接器错误。我有一种感觉,只包括-LsomeDir和-lsomeLib并不是添加它们的正确方法。这是完整的Android.mk。LOCA

c++ - 创建一个非线程安全的 shared_ptr

我正在开发一个多线程程序,但有一个UI组件广泛使用std::shared_ptr来管理元素。我可以保证只有一个线程会使用这些shared_ptrs。有没有一种方法可以定义一个不会产生线程安全引用计数开销的shared_ptr?它可以基于boost::shared_ptr或std::shared_ptr。编辑:感谢提到intrusive_ptr的回答。我忘了提到我还需要weak_ptr功能,所以排除了它。更新:我的答案是使用Boost中的local_shared_ptr。查看来自“他漫步”的评论 最佳答案 AndreiAlexandr

c++ - 锁定 shared_ptr

我有一个共享对象需要发送到系统API并稍后将其提取回来。系统API仅接收void*。我不能使用shared_ptr::get()因为它不会增加引用计数,并且它可能在从系统API提取之前被其他线程释放。发送一个新的shared_ptr*将起作用,但涉及额外的堆分配。一种方法是让对象派生自enable_shared_from_this。但是,由于此类模板仅拥有一个weak_ptr,因此不足以防止对象被释放。所以我的解决方案如下所示:classMyClass:publicenable_shared_from_this{private:shared_ptrm_this;public:void*

c++ - 多个 shared_ptr 存储相同的指针

考虑这个程序:#include#includeclassX:publicstd::enable_shared_from_this{public:structCleanup1{voidoperator()(X*)const;};structCleanup2{voidoperator()(X*)const;};std::shared_ptrlock1();std::shared_ptrlock2();};std::shared_ptrX::lock1(){std::cout(this,Cleanup1());}std::shared_ptrX::lock2(){std::cout(this