如下所示,函数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返回的指针是否为空。