草庐IT

weak_ptr_cast

全部标签

c++ - 如何从 shared_ptr 调用私有(private)析构函数?

我有一个resource_manager维护std::vector>的类在内部。resource_manager是resource的好友类.我要resources只能由resource_manager创建/删除,所以我将其构造函数设为私有(private)(可以正常工作)。但是,如果我将析构函数设为私有(private),则代码不会编译,因为析构函数由boost::shared_ptr调用,这不是resource的friend.我正在考虑通过只返回constresource*来强制执行“不要被客户删除”规则来自resource_manager,但不知何故我对这种方法提供的安全性不满意(

c++ - 如何将 shared_ptr 作为参数传递给可变对象?

我想通过对函数的智能指针引用传递一个对象。该函数可能会更改引用对象的值,但可能不会更改引用本身。有两种明显的方法可以解决这个问题。按值传递shared_ptr的第一种方法-它是引用,因此它本身不需要按引用传递。这样做的明显问题是引用的复制,这表明存在一些引用计数开销。voidfoo(shared_ptrp)第二种方法是通过const引用传递shared_ptr-避免复制shared_ptr实例,而是暗示对引用对象的访问需要两层解引用而不是一层。voidfoo(constshared_ptr&p)在实践中,这些理论开销通常微不足道且无关紧要。这对我来说表明,我应该几乎总是遵循一些标准惯例

c++ - weak_ptr 是基类的,而 shared_ptr 是派生类的?

我有一个结构来管理从基类派生的对象Entity,但不控制它们的生命周期。我希望这个结构被赋予像weak_ptr这样的弱指针这样它就可以知道该对象是否已在其他地方被销毁。但是,在共享指针所在的管理结构之外,我希望共享指针更具体shared_ptr(SpecificEntity使用Entity作为基类)。有没有什么办法可以做到这一点,或者类似的东西? 最佳答案 很有可能。您可以随时转换shared_ptr到shared_ptr隐含地,对于另一个方向你有std::static_pointer_cast和std::dynamic_point

c++ - 什么是 (void*) casting?

我确实尝试在StackOverflow上搜索此内容,但我认为由于语法原因以及不知道要搜索的确切内容,我有点不知所措。我见过(void*)被用来转换,通常是函数调用。这是做什么用的? 最佳答案 void*,通常称为void指针,是一种通用指针类型,可以指向任何类型的对象。指向不同类型对象的指针在内存中几乎相同,因此您可以使用void指针来避免类型检查,这在编写处理多种数据类型的函数时非常有用。空指针在C中比在C++中更有用。您通常应该避免使用void指针,而是使用函数重载或模板。类型检查是个好东西!

c++ - unique_ptr::deleter_type::pointer 有什么用?

std::unique_ptr指定存储不是T*如您所料,但是类型为std::unique_ptr::pointer的对象.这基本上定义为D::pointer如果存在这样的类型,并且T*否则。因此,您可以通过适本地自定义删除器来自定义底层原始指针类型。什么时候这样做是个好主意?它是干什么用的?我能找到的唯一讨论是thisnote,这暗示“更好地支持[ing]共享内存上下文中的容器和智能指针”,但这并没有完全说明很多问题。 最佳答案 最初的动机是启用boost::offset_ptr的使用作为unique_ptr下的表示,这将允许在进程

c++ - 如果我需要多态性,我应该使用原始指针而不是 unique_ptr 吗?

如果我需要多态性,我应该使用原始指针而不是unique_ptr吗?我看到一些线程显示如何使用unique_ptr进行多态行为。我不确定这是否值得,我宁愿使用原始指针。您能否对此发表评论,您对这种情况下原始指针与智能指针的看法? 最佳答案 下面的简单代码表明std::unique_ptr从多态性的角度来看工作得很好,打印"HellofromDerived."。#include#includeusingstd::cout;structBase{virtual~Base(){}virtualvoidSayHello(){coutpBase

c++ - shared_ptr 是线程安全的开销是多少?

std::shared_ptr保证是线程安全的。我不知道典型的实现使用什么机制来确保这一点,但它肯定有一些开销。即使您的应用程序是单线程的,这种开销也会存在。是上述情况吗?如果是这样,如果您没有使用线程安全保证,这是否意味着它违反了“您不为未使用的东西付费”的原则? 最佳答案 如果我们检查cppreferencestd::shared_ptr的页面他们在实现说明部分陈述了以下内容:Tosatisfythreadsafetyrequirements,thereferencecountersaretypicallyincremented

c++ - static_cast<T> 对 T& 做了什么?

所以我问了thisquestion我正在尝试通过static_cast解决它。(顺便说一句,它确实解决了问题,我只是不确定我是否理解为什么。)在代码中:vectorfoo={0,42,0,42,0,42};replace(begin(foo),end(foo),static_cast(foo.front()),13);static_cast是否只是构造一个R值int?那和只是打电话有什么区别:replace(begin(foo),end(foo),int{foo.front()},13);编辑:根据答案static_cast的推断,确实似乎构造了一个R值int:http://ideon

c++ - 在 C++ 中将具有 unique_ptr 的对象插入 vector

我有一个简单的类结构来模拟离散模拟,它有一个状态vector,每个状态包含许多转换,作为智能指针vector保存。我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态性。#include#includeclassTransition{public:Transition(){}};classState{public:State(intnum):num(num),transitions(){}voidadd_transition(std::unique_ptrtrans){transitions.push_back(std::move(trans));}private:intnum

c++ - 为什么找不到用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?

我使用的是VisualStudio2015。知道为什么这段代码可以编译:#includeclassFoo;classBar;typedefstd::pair>Object;typedefstd::vectorObjectVect;booloperator==(std::weak_ptrleft,std::weak_ptrright){returnleft.lock()==right.lock();}intmain(intargc,char*argv[]){ObjectVectvect;Objectobj;autofoundIter=std::find(vect.begin(),vect