智能指针小结

使用->操作符返回对象的引用,使用.操作符访问智能指针原来的方法。
智能指针使用p.get()返回原始指针
p.release()把智能指针清空,指针指向的内存并没有清空
如果在智能指针自动释放之前,想要人工释放,使用p.reset()进行释放。
p.swap(q)或者swap(p,q)将两个智能指针进行交换

auto_ptr:如果要判断一个auto_ptr是否为空,使用(ptest.get()== NULL)进行判断
auto_ptr进行赋值之后,赋值等号右侧指针被销毁
auto_ptr是c++98中的方案,在c++11中被弃用了,写代码尽量不要使用它

unique_ptr:如果要判断unique_ptr是否为空,可以直接使用pTest== NULL来判空。
unique_ptr作为参数传进函数时候,需要使用std::move(ptest)
程序将unique_ptr赋值给另一个,如果源unique_ptr是一个临时右值,编译器允许这么做,但如果源unique_ptr将存在一段时间,编译器不允许。

shared_ptr使用计数机制来表明共享数量

weak_ptr用来解决shared_ptr之间的相互引用的死锁问题
weak_ptr不增加引用计数,和shared_ptr可以互换
不能通过weak_ptr的方式访问对象,应该使用shared_ptr< B> p = pa->pb.lock()转换成shared_ptr,

测试代码:

//Author: chang                                                                                                                                                             
//This is a test of smart pointer


include <iostream>
#include <memory>   //智能指针使用必须包含的头文件
#include <string>

using std::string;

class Base {
    public:
        Base(string s) {
            str = s;
        }
        ~Base() {
            std::cout << "base delete:" << str << std::endl;;
        }
        string& getStr() {
            return str;
        }
        void setStr(string s) {
            str = s;
        }
        void print() {
            std::cout << "print " << str << std::endl;;
        }
    private:
        string str;
};

void AutoPtrTest(void)
{
    std::cout << "enter into AutoPtrTest" << std::endl;
    std::auto_ptr<Base> p_auto1(new Base("123"));
    std::auto_ptr<Base> p_auto2(new Base("456"));
    //使用这种方式对auto_ptr进行判空
    if (p_auto1.get() == NULL)
        std::cout << "p_auto1 is null" << std::endl;
    else
        std::cout << "p_auto1 is not null" << std::endl;
    //pTest2为空,析构时出现错误
    //p_auto1 = p_auto2;
    p_auto1->print();
    p_auto2->print();

}

void UniquePtrTest(void)
{
    std::cout << "enter into UniquePtrTest" << std::endl;
    std::unique_ptr<Base> p_unique1(new Base("123"));
    std::unique_ptr<Base> p_unique2(new Base("456"));
    //使用这种方式对unique_ptr进行判空
   if (p_unique1 == NULL)                 
        std::cout << "p_unique1 is null" << std::endl;
    else
        std::cout << "p_unique1 is not null" << std::endl;
    Base* p_base = new Base("789");
    //首先p_unique2进行析构后为空,指针转移给p_unique1,p_unique2打印时出现错误
    //p_unique1 = std::move(p_unique2);
    p_unique1->print();
    p_unique2->print();
    //p_unique1.release();                                              //放弃指针的使用权,使unique_ptr置为空,但是所指向的内存并没有清空
    //p_unique1->print();                                               //release之后p_unique1为空,再进行打印会出现错误
    p_unique2.reset(p_base);                                            //将p_unique2的指针指向b_base,原指针内存清空
                                                                        /注意:这里reset内的指针不能是智能指针,需要是内置指针
    p_unique2->print();
    p_unique2.reset();                                                  //释放智能指针所指向的对象,在自动释放之前想要人工释放,可以使用这种方式
    //p_unique2->print();                                               //reset之后p_unique2为空,再进行打印会出现错误
}

void SharedPtrTest(void)
{
    std::cout << "enter into SharedPtrTest" << std::endl;
    std::shared_ptr<Base> p_shared(new Base("123"));
    p_shared->print();
    Base* p_base = p_shared.get();                                          //使用这种方式获取智能指针保存的指针,需小心,如果智能指针释放了对象,普通指针也为空
    std::cout << "p_shared.count:" << p_shared.use_count() << std::endl;    //与共享对象的shared_ptr的个数
    std::cout << "p_shared.unique:" << p_shared.unique() << std::endl;      //user_count返回1时候为true,否则为false
}

void WeakPtrTest(void)
{
    std::cout << "enter into WeakPtrTest" << std::endl;
    //weak_ptr并没有->和*操作符,不可以直接通过weak_ptr使用对象
    //std::weak_ptr<Base> p_weak(new Base("123"));
    std::shared_ptr<Base> p_shared(new Base("123"));
    std::weak_ptr<Base> p_weak(p_shared);
    std::cout << "p_weak.count:" << p_weak.use_count() << std::endl;        //与共享对象的shared_ptr的个数
    std::shared_ptr<Base> p_shared2 = p_weak.lock();                        //返回weak对象所指向的shared_ptr
    std::cout << "p_weak.expired:" <<p_weak.expired() << std::endl;         //p_weak.use_count()返回0时候为true,否则为false

}
int main()
{
    AutoPtrTest();
    UniquePtrTest();
    SharedPtrTest();
    WeakPtrTest();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值