智能指针
智能指针
shared_ptr
操作方法
操作实例
1 |
|
unique_ptrc
操作实例
1 |
|
weak_ptr
初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18int main()
{
//weak_ptr的初始化
std::shared_ptr<int> sharedPtr(new int{233});
//无参构造
std::weak_ptr<int> weakPtr;
//拷贝构造
std::weak_ptr<int> weakPtr1(weakPtr);
//通过shared_ptr
std::weak_ptr<int> weakPtr2(sharedPtr);
//使用=
std::weak_ptr<int> weakPtr3;
weakPtr3=weakPtr2;
std::cout<<"weakPtr3.use_count:"<<weakPtr3.use_count()<<std::endl;
return 0;
}expired
判断所指的对象是否析构1
2
3
4
5
6
7
8
9
10
11
12
13int main(){
std::shared_ptr<int> sharedPtr(new int{244});
std::weak_ptr<int>weakPtr(sharedPtr);
std::cout<<"weakPtr.use_count():"<<weakPtr.use_count()<<std::endl;
std::cout<<"weakPtr.expired():"<<(weakPtr.expired()?"is":"not")<< std::endl;
sharedPtr.reset();
std::cout<<"weakPtr.use_count():"<<weakPtr.use_count()<<std::endl;
std::cout<<"weakPtr.expired():"<<(weakPtr.expired()?"is":"not")<< std::endl;
return 0;
}
注意事项
不能使用同一个堆内存初始化智能指针
![image-20230319185006853](C:\Users\12414\OneDrive - cuit.edu.cn\桌面\智能指针.assets\image-20230319185006853.png)
但是可以使用”=” 进行赋值操作
1
2
3
4
5
6
7
8
9Test* test=new Test;
std::shared_ptr<Test>sharedPtr(test);
std::shared_ptr sharedPtr1=sharedPtr;
std::cout<<"sharedPtr.use_count():"<<sharedPtr.use_count()<<std::endl;
std::shared_ptr<Test> sharedPtr2= std::move(sharedPtr);
std::cout<<"sharedPtr2.use_count():"<<sharedPtr2.use_count()<<std::endl;
std::shared_ptr<Test> sharedPtr3=sharedPtr;
std::cout<<"sharedPtr3.use_count():"<<sharedPtr3.use_count()<<std::endl;
//此时sharedPtr已经move,所以结果为0对智能指针使用’.’操作的智能指针的api,如果使用’->’操作的是,对应的类的成员方法
正确的返回
this
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20struct Test:public std::enable_shared_from_this<Test>{
Test(){
std::cout<<"Test()"<<std::endl;
}
~Test(){
std::cout<<"~Test()"<<std::endl;
}
std::shared_ptr<Test> getSharedPtr(){
return shared_from_this();
}
};
int main(){
std::shared_ptr<Test> sharedPtr(new Test);
std::cout<<"sharedPtr.use_count():"<<sharedPtr.use_count()<<std::endl;
std::shared_ptr<Test> sharedPtr1=sharedPtr->getSharedPtr();
std::cout<<"sharedPtr1.use_count():"<<sharedPtr1.use_count()<<std::endl;
return 0;
}共享智能指针不能循环引用
智能指针
https://tsy244.github.io/2023/04/11/cpp/智能指针/