c++ 指针

原指针

相当于C中的指针。

 

智能指针

#include <memory>

不必使用 delete 运算符释放内存,只要不在需要智能指针,它们就会自动释放

    int i = 10;
    std::unique_ptr<int> pdata{&i};  //error

    std::cout << *pdata << std::endl;

智能指针在结束时候会自动将指着指向的内存释放掉,所以,智能指针只能指向动态分配的内存地址

 

unique_ptr<T>

    std::unique_ptr<int> pdata = new int{10};    //error
    std::unique_ptr<int> pdata{new int{10}};    //correct
    std::unique_ptr<int> pdata2;

    pdata2 = pdata;  //error

 

shared_ptr<T>

#if 0 //共享指针定义 1
std::shared_ptr<int> pdata{new int{10}};
#else //共享指针定义 2
auto pdata = std::make_shared<int>(10);
#endif std::shared_ptr<int> pdata2 = pdata;

 

如上图所示,如果智能指针指向的对象中包含shared智能指针成员,并且该智能指针指向如上图所示:

D中有成员指向A

A中有成员指向B

B中有成员指向C

C中有成员指向D

当pA, pB, pC, pD 全部释放之后,由于此时还有shared指针指向该内存空间,所以此时表示对象A,B,C,D的内存空间都

不会被释放,就会造成内存泄露。

 

因为上图所示的问题,所以引入了下边的 weak_ptr 弱指针。

 

weak_ptr<T>

总是从 shared_prt<T> 中创建

    std::shared_ptr<int> pdata{new int{10}};
    std::weak_ptr<int> pdata2{pdata};

    if (pdata2.expired()) {
        std::cout << "no exists..." << std::endl;
    } else {
        std::cout << "exists..." << std::endl;
    }

 

posted on 2018-07-17 15:55  rivsidn  阅读(125)  评论(0)    收藏  举报

导航