C++智能指针shared_ptr用get()或*获取原始对象,引用计数变为0后,原始对象是否可以用

问题遇到的现象和发生背景

如下所示,函数get_ptr返回一个shared_ptr,调用时用一个原始对象ClassA test 接收,函数返回后会构造一个shared_ptr临时对象,然后*操作之后赋值给ClassA test 。
此时让share_aa 指向另一个对象,weak_aa显示原对象引用计数为0,该对象仍可用,该操作是否存在危险?

问题相关代码,请勿粘贴截图
shared_ptr<ClassA>share_aa = make_shared<ClassA>();
weak_ptr<ClassA>weak_aa = share_aa;

shared_ptr<ClassA> get_ptr(){
        return share_aa;
}

int main(int argc, char* argv[])
{       // 引用计数1
        cout<<weak_aa.use_count()<<endl;;

        ClassA& test = *get_ptr();
        share_aa = make_shared<ClassA>();
        //引用计数0
        cout<<weak_aa.use_count()<<endl;
        //  ub??
        cout<<test.a<<endl;
}

当然有问题,因为你的类里面没有什么易出错的字段,给你改一下就知道了

#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
#include <memory>
using namespace std;
class ClassA {
    int nsize;
    int* a;
public:
    ClassA(int n = 1):nsize(n),a(new int[n])
    {
        
        for (int i = 0; i < n; i++)
            a[i] = i;
        cout << "construct" << endl;
    }
    void print() {
        for (int i = 0; i < nsize; i++)
            cout << a[i] << " " << endl;
    }
    ~ClassA() {
        delete[] a;
        a = nullptr;
        cout << "deconstruct" << endl;
    }
};
shared_ptr<ClassA> share_aa = make_shared<ClassA>();
weak_ptr<ClassA> weak_aa = share_aa;

shared_ptr<ClassA> get_ptr() {
    return share_aa;
}
                                                       
int main(int argc, char* argv[])
{       // 引用计数1
   

    cout<< weak_aa.use_count() << endl;;

    ClassA& test = *get_ptr();
    share_aa = make_shared<ClassA>();
    //引用计数0
    cout << weak_aa.use_count() << endl;
    cout << share_aa.use_count() << endl;
    //  ub??
    cout << weak_aa.expired() << endl;
    test.print();
   
}


没有问题,如果weak_ptr所指的对象被销毁了,那么weak_ptr再lock时返回的是空指针,不会是野指针,所以weak_ptr使用时一定要判断lock返回的指针是否为空。