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;
    }
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号