C++智能指针的讲解

C++智能主要用来智能管理内存:

有以下三种:

  1. shared_ptr;

利用引用计数,共同指向同一个内存;当引用计数为0,那么释放空间;

  1. weak_ptr;

shared_ptr的伴随指针,主要用来解决shared_ptr相互引用,无法释放的情况。

使用weak_ptr不会占用引用计数

同时weak_ptr也可以用来判断,所指的shared_ptr是否有指针悬挂问题,通过weak_ptr的unlock()或者expired来解决

  1. 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;
 }
}

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务