std::shared_ptr 与 std::weak_ptr

构建3,4,5的二叉树

#include <iostream>
#include <memory>
class Person
{
private:
    /* data */
public:
    Person(int v);
    ~Person();
    int value;
};

Person::Person(int v)
{
    value=v;
}

Person::~Person()
{
}

void DeleteIntPtr(int* p){
    delete p;
}

void DeleteIntArrPtr(int* p){
    delete[] p;
}

class Node
{
public:
    int value;
    std::shared_ptr<Node> leftNode;
    std::shared_ptr<Node> rightNode;
    // std::shared_ptr<Node> parentNode;
    std::weak_ptr<Node> parentNode;
    Node(int v):value(v){
        std::cout<<"constructor"<<std::endl;
    }
    ~Node()
    {
        std::cout<<value<<"destructor"<<std::endl;
    }

};

int main()
{
    // std::cout<<"hello world !"<<std::endl;
    // std::shared_ptr<Person> p1(new Person(1));// Person(1)的引用计数为1
    // std::shared_ptr<Person> p2=std::make_shared<Person>(2);
    // p1.reset(new Person(3));//首先生成新对象,然后p1指向的对象Penson(1)引用计数减1,此时引用计数为0,故析构Person(1) 最后将新对象的指针交给智能指针p1
    // std::shared_ptr<Person> p3=p1;//现在p1和p3同时指向Person(3),Person(3)的引用计数为2
    // reset()包含两个操作。当智能指针中有值的时候,调用reset()会使引用计数减1.当调用reset(new xxx())重新赋值时,
    // 智能指针首先是生成新对象,然后将之前指向的对象引用计数减1(当然,如果发现引用计数为0时,则析构旧对象),然后将新对象的指针交给智能指针保管
    // p1.reset();//Person(3)的引用计数为1
    // p3.reset();//Person(3)的引用计数为0,析构Person(3)
    
    // 注意,不能将一个原始指针直接赋值给一个智能指针,如下所示,原因是一个是类,一个是指针。
    // std::shared_ptr<int> p4 = new int(1);// error

    // 获取原始指针
    // std::shared_ptr<int> p4(new int(5)); 
    // int* pInt=p4.get();

    // //指定删除器 shard_ptr自动调用指定的删除器来释放内存。不支持删除数组对象
    // int* p=new int;
    // *p=5;
    // std::cout<<*p<<std::endl;

    std::shared_ptr<int> sp(new int(3));
    std::weak_ptr<int> wp=sp;
    std::weak_ptr<int> wp1=sp;
    if (wp.expired())//不会运行
    {
        std::cout<<"wp"<<wp.use_count()<<sp.use_count()<<std::endl;// 1 1 wq的使用不会使sp指向对象的引用次数+1
    }
    // auto lwp=wp.lock();//当调用lock时 sp与wp的引用都会+1    //reference:2 2 2
    // std::cout<<*lwp<<std::endl;//3
    std::cout<<"reference:"<<wp.use_count()<<" "<<wp1.use_count()<<" "<<sp.use_count()<<std::endl;//当不调用lock时 reference:1 1 1
    

    std::shared_ptr<Node> ptr(new Node(3));
    
    ptr->leftNode=std::make_shared<Node>(4);
    ptr->leftNode->parentNode=ptr;
    ptr->rightNode=std::make_shared<Node>(5);
    ptr->rightNode->parentNode=ptr;
    std::cout<<"ptr:"<<ptr->value<<std::endl;//3
    std::cout<<"ptr->leftNode:"<<ptr->leftNode->value<<std::endl;//4
    std::cout<<"ptr->rightNode:"<<ptr->rightNode->value<<std::endl;//5
    std::shared_ptr<Node> rightParentNode=ptr->rightNode->parentNode.lock();//如何使用weak指针指向的资源
    // if(ptr->rightNode->parentNode.expired())
    // {
    //      std::cout << "ptr reference count = " << ptr.use_count() << std::endl;
    //      std::cout<<"expired!!"<<std::endl;
    // }
        
    std::cout<<"ptr->rightNode->parentNode:"<<rightParentNode->value<<std::endl;//3
    std::cout << "ptr reference count = " << ptr.use_count() << std::endl;//lock() 2
    std::cout << "ptr->leftPtr reference count = " << ptr->leftNode.use_count() << std::endl;//1
    std::cout << "ptr->rightPtr reference count = " << ptr->rightNode.use_count() << std::endl;//1


    
    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值