C++智能指针的讲解
C++智能主要用来智能管理内存:
有以下三种:
- shared_ptr;
利用引用计数,共同指向同一个内存;当引用计数为0,那么释放空间;
- weak_ptr;
shared_ptr的伴随指针,主要用来解决shared_ptr相互引用,无法释放的情况。
使用weak_ptr不会占用引用计数
同时weak_ptr也可以用来判断,所指的shared_ptr是否有指针悬挂问题,通过weak_ptr的unlock()或者expired来解决
- unique_ptr;
只有一个智能指针,可以指向内存 可以通过std::move或者unique_ptr.release()来释放,更换智能指针。
Quesition:
1. shared_ptr的模板
#include <iostream>
#include <memory>
using namespace std;
//链接
// 下面这个知乎讲的很不错,安利https://zhuanlan.zhihu.com/p/355812360#:~:text=shared_ptr%3A%20%E7%AE%A1%E7%90%86%E7%9A%84%E8%B5%84%E6%BA%90%E8%A2%AB,%E9%87%8A%E6%94%BE%EF%BC%8C%E4%BD%86weak_ptr%E4%BB%8D%E7%84%B6%E5%AD%98%E5%9C%A8%E3%80%82
template<typename T>
class SharedPtr{
pubic:
// 没想到的很赞的方法
int *counter;// 引用计数,用指针表示,多个sharedPtr之间可以同步呀
// 如果用全局static 是不是所有的都只通过一个counter进行计算?
T* resource;// 裸指针
SharedPtr(T *resc=nullptr){ // 构造函数
counter=new int(1);
resource=resc;
}
SharedPtr(const SharedPtr & rhs){
resource=rhs.resource;
counter=rhs.counter;
*counter++;
}
// 赋值函数
SharedPtr& operator=(const SharedPtr&rhs){
resource=rhs.resource;
counter=rhs.counter;
++*counter;
}
//析构函数
~SharedPtr(){
--*counter;
if(*counter==0){
delete counter;
delete resource;
}
}
int use_counter(){
return *counter;
}
};
2.理解以下相互引用,weak_ptr怎么解决shared_ptr的相互引用问题
以下存在相互引用问题
#include<memory>
#include<iostream>
using namespace std;
// 为什么使用weak_ptr
/**
* 1. 利用weak_ptr去检查指针是否空悬,存在内容
* 2. 利用weak_ptr解决shared_ptr相互引用而无法释内存的情况
**/
class B;
class A{
public:
shared_ptr<B>bptr;
A() {
cout << "A created" << endl;
}
~A() {
cout << "A destroyed" << endl;
}
};
class B
{
public:
shared_ptr<A>aptr;
B() {
cout << "B created" << endl;
}
~B() {
cout << "B destroyed" << endl;
}
};
int main(){
{
shared_ptr<A> a = make_shared<A>();
shared_ptr<B> b = make_shared<B>();
a->bptr = b;
b->aptr = a;
}
}
利用weak_ptr解决了这个问题
#include<memory>
#include<iostream>
using namespace std;
// 为什么使用weak_ptr
/**
* 1. 利用weak_ptr去检查指针是否空悬,存在内容
* 2. 利用weak_ptr解决shared_ptr相互引用而无法释内存的情况
**/
class B;
class A{
public:
weak_ptr<B>bptr;
A() {
cout << "A created" << endl;
}
~A() {
cout << "A destroyed" << endl;
}
};
class B
{
public:
weak_ptr<A>aptr;
B() {
cout << "B created" << endl;
}
~B() {
cout << "B destroyed" << endl;
}
};
int main(){
{
shared_ptr<A> a = make_shared<A>();
shared_ptr<B> b = make_shared<B>();
a->bptr = b;
b->aptr = a;
}
}