智能指针用过吗,有哪些,他们的区别和各自的优缺点

智能指针主要用于处理C++之中动态内存分配时由于一些操作可能会导致悬空指针以及内存泄漏问题的情况。C++之中的智能指针主要包含unique_ptr,shared_ptr,weak_ptr这三种。

1,unique_ptr是一种独享的智能指针,一个unique_ptr只能指向一个对象,不允许被复制。它优点是由于不存在引用计数的操作,性能较高,但是由于不允许被复制,所以使用场景比较受限。但是可以通过move转移资源的所有权。

2.shared_ptr是一种允许多个shared_ptr智能指针共享同一个对象,创建新的或者复制shared_ptr都会使引用计数加1 ,当引用计数为0时将对对象进行销毁。由于允许多个shared_ptr对同一个对象进行引用,所以使用的场景比较多,同时由于存在引用计数等操作,消耗性能比较高。

3.weak_ptr是一种弱引用,主要是针对shared_ptr智能指针的循环引用做出的一种指针,通常用于打破shared_ptr的循环引用,还可以用于观察shared_ptr指向的对象是否存在与场景之中,与shared_ptr搭配使用,由于weak_ptr是一种弱引用,不会计入引用计数,没有对象的资源所有权,所以访问对象时需要使用lock对对象进行操作,所以使用起来比较复杂。

下面两段代码:

//C++11智能指针 主要针对与weak_ptr访问对象做的例子
#include
#include
using namespace std;
class Test{
    public:
        Test(){
            cout<<"构造函数被调用"<         }
        ~Test(){
            cout<<"析构函数被调用"<         }
        void DoSomething(){
            cout<<"调用类之中的函数"<         }
};
int main(){
    shared_ptr shared=make_shared();
    weak_ptr weak=shared;
    shared_ptr lock=weak.lock();
    if(lock){
        lock->DoSomething();
    }
    else{
        cout<<"无法锁定对象,可能对象被销毁"<     }
    shared.reset();
    lock=weak.lock();
    if(lock){
            lock->DoSomething();
    }
    else{
        cout<<"无法锁定对象,可能对象被销毁"<     }
    return 0;
    
}

其中运行结果:

构造函数被调用
调用类之中的函数
调用类之中的函数
析构函数被调用。

这是由于,weak调用lock返回的对象是一个shared_ptr对象,使lock对类有引用,引用计数不为0,不会调用析构函数,一直到程序结束才调用析构函数。

//C++11智能指针 主要针对与weak_ptr访问对象做的例子
#include
#include
using namespace std;
class Test{
    public:
        Test(){
            cout<<"构造函数被调用"<         }
        ~Test(){
            cout<<"析构函数被调用"<         }
        void DoSomething(){
            cout<<"调用类之中的函数"<         }
};
int main(){
    shared_ptr shared=make_shared();
    weak_ptr weak=shared;
    shared_ptr lock=weak.lock();
    if(lock){
        lock->DoSomething();
    }
    else{
        cout<<"无法锁定对象,可能对象被销毁"<     }
   
    weak.reset();
    lock=weak.lock();
    if(lock){
            lock->DoSomething();
    }
    else{
        cout<<"无法锁定对象,可能对象被销毁"<     }
    return 0;
    
}

这段代码由于weak被重置,再次调用weak.lock返回的是一个空的对象,所以找不到对象。

运行结果如下:

构造函数被调用
调用类之中的函数
无法锁定对象,可能对象被销毁
析构函数被调用

直到程序结束才调用析构函数。

你可能感兴趣的:(U3D客户端面试题汇总,c++,开发语言,面试)