std::shared_ptr<T>(dynamic_cast<T*>(r.get())以及std::shared_ptr<T>(const_cast<T*>(r.get()))似乎(might seem)有相同的效果,但是这些表达式会造成程序产生未定义行为,未定义行为就是可能会尝试销毁删除同一个对象多次
这行代码尝试将 basePtr 转换为 std::shared_ptr<Derived>。dynamic_pointer_cast 会在运行时检查转换是否安全(即 basePtr 是否确实指向一个 Derived 类对象)。如果转换成功,derivedPtr 将被赋予新的类型,并指向原来的对象;如果转换失败,derivedPtr 将为nullptr。 检查转换结果并调用方法: cpp if (derived...
shared_ptr<B> ptrb(new B()); shared_ptr<A> ptra( dynamic_pointer_cast<A>(ptrb) );//从 shared_ptr 提供的类型转换 (cast) 函数的返回值构造 5./* shared_ptr 的“赋值”*/ shared_ptr<T> a(new T()); shared_ptr<T> b(new T()); a = b; // 此后 a 原先所指的对象会被销毁,b...
相信xxx_cast 系列都很熟了。 static_cast, dynamic_cast, const_cast, reinterpret_cast. 但是当面对boost::shared_ptr的时候呢? reinterpret_cast 可以转换任何类型,这个在讨论范围之外。 对于下面的这个定义: 1classA 2{ 3public: 4virtual~A() {} ...
shared_ptr还定义了自己的类型转换操作符:static_pointer_cast, dynamic_pointer_cast, const_pointer_cast ,具体用法见下面代码。 (3)弱引用指针weak_ptr不能直接访问对象,但是他有一些工具函数可以用来用 .expired()用来查看自己监视的对象是否还在,或者他依赖的那些强引用指针们还有没有了 ...
shared_ptr<D> spd = shared_dynamic_cast<D>(spb); //变成子类的指针 shared_ptr在竭尽全力表演的像一个原生指针,原生指针能干的事,它也基本上能干。 另一个同get相关的错误 shared_ptr<T> sp(new T); shared_ptr<T> sp2( sp.get() ) ;//又一个“二龙治水”实例,指针会删2次而错误。
我们用支持RTTI的dynamic_cast对裸指针进行向下转换 intmain() { Animal*animal_p=newCat("zhang","bsm"); Cat*cat_p=dynamic_cast<Cat*>(animal_p);// 只有当animal_p指向Cat对象时,才能成功。转换失败时,返回nullptr deletecat_p; return0;
shared_ptr<D> spd = shared_dynamic_cast<D>(spb); //变成子类的指针 shared_ptr在竭尽全力表演的像一个原生指针,原生指针能干的事,它也基本上能干。 另一个同get相关的错误 shared_ptr<T> sp(new T); shared_ptr<T> sp2( sp.get() ) ;//又一个“二龙治水”实例,指针会删2次而错误。
应用static_cast、dynamic_cast、const_cast或reinterpret_cast到被存储指针 (函数模板) get_deleter 返回指定类型中的删除器,若其拥有 (函数模板) operator==operator!=operator<operator<=operator>operator>=operator<=> (C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20) ...