派生类的shared_ptr具有以下优势: 自动内存管理:shared_ptr使用引用计数来管理对象的生命周期,当没有任何shared_ptr指向对象时,对象会被自动销毁,避免了手动释放内存的麻烦。 避免内存泄漏:由于shared_ptr使用引用计数,可以确保对象在不再被使用时被正确释放,避免了内存泄漏的问题。
在使用具有shared_ptr派生类型的shared_ptr基类型重写方法时,可以通过继承和重写基类的方法来实现。派生类可以继承基类的接口和实现,并且可以添加自己的特定实现。通过使用shared_ptr作为派生类的基类型,可以确保在对象不再被引用时自动释放内存。 这种重写方法的优势在于可以更好地管理内存,避免内存泄漏和悬...
__shared_count其实是个类,从名字可知,__shared_count也是和托管内存引用计数相关的类,__shared_count类内部维护了_Sp_counted_base类型的成员指针_M_pi,_M_pi又指向_Sp_counted_base派生类对象_Sp_counted_ptr的地址。 template<_Lock_policy_Lp>class__shared_count{template<typename_Ptr>explicit__shared_co...
_M_release方法是该类的关键,可以看到先将_M_use_count自减1,然后判断自减前_M_use_count的值是否为1(无其他人引用),如果为1,则调用_M_dispose方法(虚函数,由派生类实现,估计是释放前面一直说的那个由智能指针接管的普通指针)。接下来将_M_weak_count自减1,然后判断自减前_M_weak_count的值是否为1(无...
然而,直接将派生类的shared_ptr赋值给基类的shared_ptr会导致类型不匹配的错误。因此,需要进行类型转换来确保类型安全。此外,在某些情况下,还需要进行动态类型转换以判断对象的实际类型。 3. shared_ptr的静态类型转换 静态类型转换使用static_pointer_cast函数,它可以在编译时检查类型关系,确保转换的安全性。static_...
任何有虚函数的类都必须有虚析构函数 -- 什么时候不适用虚析构函数: 1. 类的大小需要很小的时候 2. 类的大小需要精确的时候,例如将一个对象从C++传到C */ /* 方法2: 使用shared_ptr,注意使用unique_ptr并没有此效果 */ classdog{ ~dog() {...} ...
从源代码中可以看到_Sp_counted_ptr是_Sp_counted_base的派生类,并且__shared_count在初始化_M_pi时用的也是_Sp_counted_ptr。 接着看_M_dispose方法的实现,里面确实删除了一开始shared_ptr接管的指针,_M_destroy方法用于释放自己的内存(由__shared_count调用),和前面猜想一致...
public: // 派生类无法进行拷贝构造和赋值 My_Ref_count_base(constMy_Ref_count_base&)=delete; My_Ref_count_base&operator=(constMy_Ref_count_base&)=delete; // 虚析构,多态释放 virtual~My_Ref_count_base(){}; void_Incref() {_Uses+=1; } ...
使用shared_from_this获取这个派生类的_M_weak_this对应的shared_ptr指针template<_Lock_policy _Lp>class __shared_count{private:friend class __weak_count<_Lp>;_Sp_counted_base<_Lp>*_M_pi;};6使用weak_ptr构造__shared_ptr:template<_Lock_policy _Lp>class __shared_count{private:friend class _...
从源代码中可以看到_Sp_counted_ptr是_Sp_counted_base的派生类,并且__shared_count在初始化_M_pi时用的也是_Sp_counted_ptr。 接着看_M_dispose方法的实现,里面确实删除了一开始shared_ptr接管的指针,_M_destroy方法用于释放自己的内存(由__shared_count调用),和前面猜想一致 ...