2. 从父类shared_ptr转到子类shared_ptr的需求场景 在实际编程中,有时我们需要将一个指向父类对象的shared_ptr转换为指向子类对象的shared_ptr。这通常发生在多态的场景中,当我们知道某个父类指针实际上指向的是一个子类对象时,我们可能希望调用子类特有的方法或访问子类特有的成员。
但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。 对于此种行为的原因尚未查明(待更新)。也许这是std::shared_ptr专门设计的一种特性。但为谨慎起见,我们也未必需要此特性。 C++11中引入了新的关键字“override”。对于子类中要实现多态(即要对父类方法进行override)的方法。
但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。 对于此种行为的原因尚未查明(待更新)。也许这是std::shared_ptr专门设计的一种特性。但为谨慎起见,我们也未必需要此特性。 C++11中引入了新的关键字“override”。对于子类中要实现多态(即要对父类方法进行override)的方法。
假设我们有一个父类Base和子类Derived, 我们用shared_ptr来保存Base的指针但是传入Derived对象, 比如这样 std::shared_ptr<Base> a_ptr(new Derived("d")); 理论上父类和子类的构造函数和析构函数都应该被调用到, 运行结果应该是: Base ctor:d Derived ctor:d Derived dtor:d Base dtor:d 标准std::shared...
该类没有析构函数,从智能指针最终会自动释放内存的特性来看,释放工作肯定不是在该类进行了,接下来分析父类__shared_ptr的实现 4.1.2、__shared_ptr __shared_ptr位于libstdc++-v3\include\bits\shared_ptr_base.h中 template<typename _Tp, _Lock_policy _Lp> ...
pointer to IRenderable which// uses the same lifetime control block as mereturnstd::shared_ptr<...
若A持有B的 shared_ptr,且B也持有A的 shared_ptr,此时会造成循环引用,导致A、B都无法释放。此时,我们可以使用weak_ptr。 weak_ptr不会增加引用计数,因此可以打破 shared_ptr 的循环引用。通常在继承关系中的做法是父类持有子类的 shared_ptr,子类持有指向父类的 weak_ptr。
unique_ptr unique_ptr 唯一拥有对象 通过reset方法重新指定 通过release方法释放所有权 #include#include#include#include#include#include#includestruct B { virtual void bar() { std::cout << "B::bar\n"; } virtual ~B() = default;//父类的析构函数需要定义为虚函数,防止内存泄漏 ...
{std::cout<<"父类析构函数被调用.\n";}public:child_ptr children;};classchild{public:~child(){std::cout<<"子类析构函数被调用.\n";}public:parent_ptr parent;};intmain(){parent_ptrfather(newparent());child_ptrson(newchild);// 父子互相引用。father->children=son;son->parent=father;...
shared_ptr(下) 删除器 1、shared_ptr中的px出现原因 方便对其数据空间的管理,取值和获取地址将极大的方便我们的操作。 2、解决析构函数 避免内存空间的泄漏。new出来的空间都没有释放掉! 释放拥有权靠的是引用计数。 ~shared_count(){if(pi){//判断所指父类是否为空pi->release();//释放new出来的对象和...