草庐IT

Shared-Preferences

全部标签

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 仅从基类调用析构函数?

这个问题在这里已经有了答案:shared_ptrmagic:)(3个回答)关闭8年前。为什么当使用std::shared_ptr释放时,当第二个示例仅从基类调用析构函数时,会同时从基类和派生类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestructor--------------------Basedestructor我期望在这两种情况下都有相同的行为。 最佳答案

c++ - 为什么提议的 `std::shared_ptr::operator[]` 以 `std::ptrdiff_t` 作为参数

AccordingtotheN4562proposal,thenewlyproposedstd::shared_ptr::operator[]takesinstd::ptrdiff_t,whichisasignedtype.这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[]也需要std::size_t。做出这个决定的理由是什么? 最佳答案 大概这应该是指针接口(interface)的统一吧。用作数组时,好的ol'C指针接受负索引:p[-2]与*(p-2)相同;并且ptrdiff_t因此自

c++ - boost shared_ptr 取消引用成本

我正在尝试比较原始指针、boostshared_ptr和boostweak_ptr之间的性能。在取消引用部分,我预计shared_ptr和raw_ptr相等,但结果显示shared_ptr的速度大约是原来的两倍。对于测试,我正在创建一个带有指向int的指针或共享指针的数组,然后在这样的循环中取消引用:intresult;for(inti=0;i!=100;++i){for(inti=0;i!=SIZE;++i)result+=*array[i];}测试的完整代码可以在这里找到:https://github.com/coolfluid/coolfluid3/blob/master/tes

c++ - 如何使用 std::shared_ptr<void> 和另一种类型的 std::shared_ptr 进行函数重载?

试试下面的代码:#include#includeclassC{public:voidF(std::function)>){}voidF(std::function)>){}};intmain(){Cc;c.F([](std::shared_ptr){});}你会看到一个编译错误:prog.cc:12:7:error:calltomemberfunction'F'isambiguousc.F([](std::shared_ptr){});~~^prog.cc:6:10:note:candidatefunctionvoidF(std::function)>){}^prog.cc:7:10:

c++ - 完全线程安全的 shared_ptr 实现

有人知道完全线程安全的shared_ptr实现吗?例如。shared_ptr的boost实现对于目标(引用计数)是线程安全的,并且对于同时读取shared_ptr实例也是安全的,但对于写入或读/写则不是。(参见Boostdocs,示例3、4和5)。对于shared_ptr实例是否有完全线程安全的shared_ptr实现?奇怪的是boost文档这么说:shared_ptrobjectsofferthesamelevelofthreadsafetyasbuilt-intypes.但是如果将普通指针(内置类型)与smart_ptr进行比较,那么同时写入普通指针是线程安全的,但同时写入smar

c++ - boost::~shared_ptr 是如何工作的?

在阅读《BeyondtheC++StandardLibrary:AnIntroductiontoBoost》时,我得到了一个非常有趣的例子:classA{public:virtualvoidsing()=0;protected:virtual~A(){};};classB:publicA{public:virtualvoidsing(){std::cout我做了一些测试:intmain(){//1std::auto_ptra(newB);//willnotcompile,error:‘virtualA::~A()’isprotected//2A*pa=newB;deletepa;//w

c++ - 将所有权从 std::shared_ptr 转移到 std::unique_ptr

我有一个类A,它有一个类型为std::unique_ptr:的字段classA{public:std::unique_ptrpointer;//classbody};在代码的某个地方,我使用了几个指向同一个对象的std::shared_ptr。现在我想要实现的是在我的类中将所有权转移到这个std::unique_ptr,这样如果所有shared_ptr都被销毁,我的对象将保留只要这个unique_ptr还活着。我的问题是-是否可以将所有权从std::shared_ptr转移到std::unique_ptr,如果可以,我该怎么做? 最佳答案

c++ - 在 shared_ptr 的自定义删除器中检查 nullptr 是否有意义?

我见过一些代码使用std::shared_ptr和自定义删除器来测试nullptr的参数,例如MyClass有一个close()方法,并用一些CreateMyClass构造:autopMyClass=std::shared_ptr(CreateMyClass(),[](MyClass*ptr){if(ptr)ptr->close();});在删除器中测试ptr是否为空是否有意义?这会发生吗?怎么样? 最佳答案 构造函数std::shared_ptr::shared_ptr(Y*p)要求deletep是一个有效的操作。这是一个有效的操

C++11:将 std::is_pointer 扩展为 std::shared_ptr

我想重载std::is_pointer在C++11中为std::shared_ptr生成真值同样,因为后者的行为非常类似于T*.#includenamespacestd{templatestructis_pointer>:std::true_type{};templatestructis_pointer>:std::true_type{};}我想知道为什么这个重载还没有包含在标准实现中。有没有我忽略的陷阱?当然也可以引入一个新特性is_shared_ptr.其实我一开始就尝试了下面的代码:templatestructis_pointer::type>>:std::true_type{}

c++ - 使用 shared_ptr 的开销和实现

简短介绍:我正在处理多线程代码,我必须在两个线程之间共享动态分配的对象。为了使我的代码更简洁(并且不易出错),我想在每个线程中显式“删除”对象,这就是我想使用shared_ptr的原因。第一个问题:我想知道shared_ptr中->operator的实现在运行时是否有一些额外的开销(例如,大于unique_ptr)。我所说的对象通常是longlife实例,创建后只复制一次(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段。我知道,shared_ptr只保护引用计数。第二个问题:shared_ptr在libstdc++中的优化程度如何?它总是使用互斥锁还是利用原子操作(我专注