c++11之智能指针_智能指针c++11,毕业一年萌新的物联网嵌入式开发大厂面经

20 阅读4分钟
    cout << "construct Test, x = " << x << endl;
}

Test(string str) : m_num(0)
{
    cout << "construct Test, str = " << str << endl;
}

~Test()
{
    cout << "destruct Test..." << endl;
}

void setValue(int v)
{
    this->m_num = v;
}

void print()
{
    cout << "m_num: " << this->m_num << endl;
}

private: int m_num; };

int main() { /-------------------------- 一,初始化智能指针shared_ptr ------------------------------/ //1.通过构造函数初始化 shared_ptr ptr1(new int(3)); cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;

//2.通过移动和拷贝构造函数初始化
shared_ptr<int> ptr2 = move(ptr1);
cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;
cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;

shared_ptr<int> ptr3 = ptr2;
cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;
cout << "ptr3管理的内存引用计数: " << ptr3.use_count() << endl;

//3.通过 std::make_shared初始化
shared_ptr<int> ptr4 = make_shared<int>(8);
shared_ptr<Test> ptr5 = make_shared<Test>(7);
shared_ptr<Test> ptr6 = make_shared<Test>("GOOD LUCKLY!");

//4.通过reset初始化
ptr6.reset(); //重置ptr6, ptr6的引用基数为0
cout << "ptr6管理的内存引用计数: " << ptr6.use_count() << endl;

ptr5.reset(new Test("hello"));
cout << "ptr5管理的内存引用计数: " << ptr5.use_count() << endl;

cout << endl;
cout << endl;

/*--------------------------  二,共享智能指针shared_ptr的使用  ------------------------------*/
//1.方法一
Test* t = ptr5.get();
t->setValue(1000);
t->print();

//2.方法二
ptr5->setValue(7777);
ptr5->print();

printf("\n\n");
/*------------------------------------  三,指定删除器  -----------------------------------*/
 //1.简单举例
shared_ptr<Test> ppp(new Test(100), [](Test* t) {
    //释放内存
    cout << "Test对象的内存被释放了......." << endl;
    delete t;
    });
printf("----------------------------------------------------------------------\n");

2.如果是数组类型的地址,就需要自己写指定删除器,否则内存无法全部释放
//shared_ptr<Test> p1(new Test[5], [](Test* t) {
//    delete[]t;
//    });

//3.也可以使用c++给我们提供的 默认删除器函数(函数模板)
shared_ptr<Test> p2(new Test[3], default_delete<Test[]>());

//4.c++11以后可以这样写 也可以自动释放内存
shared_ptr<Test[]> p3(new Test[3]);

return 0;

}




> 

> **另外,我们还可以自己封装一个函数模板make\_shared\_array方法来让shared\_ptr支持数组,代码如下:**

> 

> 

> 




#include #include #include using namespace std;

//有了这个函数模板,我们就不用自己去释放数组类型的地址了 template shared_ptr make_share_array(size_t size) { //返回匿名对象 return shared_ptr(new T[size], default_delete<T[]>()); }

int main() { shared_ptr ptr1 = make_share_array(10); cout << ptr1.use_count() << endl;

shared_ptr<string> ptr2 = make_share_array<string>(7);
cout << ptr2.use_count() << endl;
	
return 0;

}


##  三,独占的智能指针unique\_ptr


* 首先了解一下基本概念,再看代码,会学的很快



####  1. 初始化




> 

> 

> std::unique\_ptr是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个unique\_ptr赋值给另一个unique\_ptr。

> 

> 

> 




####  2. 删除器




> 

>  unique\_ptr指定删除器和shared\_ptr指定删除器是有区别的,unique\_ptr指定删除器的时候需要确定删除器的类型,所以不能像shared\_ptr那样直接指定删除器

> 

> 

> 





#include using namespace std; #include #include #include

class Test { public: Test() : m_num(0) { cout << "construct Test..." << endl; }

Test(int x) : m_num(1)
{
    cout << "construct Test, x = " << x << endl;
}

Test(string str) : m_num(2)
{
    cout << "construct Test, str = " << str << endl;
}

~Test()
{
    cout << "destruct Test..." << endl;
}

void setValue(int v)
{
    this->m_num = v;
}

void print()
{
    cout << "m_num: " << this->m_num << endl;
}

private: int m_num; };

int main() { /-------------------------- 一,初始化智能指针unique_ptr ------------------------------/ //1.通过构造函数初始化 unique_ptr ptr1(new int(3));

//2.通过移动函数初始化
unique_ptr<int> ptr2 = move(ptr1);

//.通过reset初始化
ptr2.reset(new int(7));

/*--------------------------  二,unique_ptr的使用  ------------------------------*/
//1.方法一
unique_ptr<Test> ptr3(new Test(666));
Test* pt = ptr3.get();
pt->setValue(6);
pt->print();

//2.方法二
ptr3->setValue(777);
ptr3->print();

/*------------------------------------  三,指定删除器  -----------------------------------*/
//1.函数指针类型
//using ptrFunc = void(*)(Test*);
//unique_ptr<Test, ptrFunc> ptr4(new Test("hello"), [](Test* t) {
//    cout << "-----------------------" << endl;
//    delete t;
//    });

//2.仿函数类型(利用可调用对象包装器)
unique_ptr<Test, function<void(Test*)>> ptr4(new Test("hello"), [](Test* t) {
    cout << "-----------------------" << endl;
    delete t;
    });

/*---------- 四,独占(共享)的智能指针可以管理数组类型的地址,能够自动释放 ---------*/
unique_ptr<Test[]> ptr5(new Test[3]);

//在c++11中shared_ptr不支持下面的写法,c++11以后才支持的
shared_ptr<Test[]> ptr6(new Test[3]);

return 0;

}


## 四, 弱引用的智能指针weak\_ptr



> 
> **弱引用智能指针`std::weak_ptr`可以看做是`shared_ptr`的助手,它不管理`shared_ptr`内部的指针。`std::weak_ptr`没有重载操作符`*``->`,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视`shared_ptr`中管理的资源是否存在。**
> 
> 
> 


####  1 初始化



#include #include using namespace std;

int main() { shared_ptr sp(new int);

weak_ptr<int> wp1;
weak_ptr<int> wp2(wp1);
weak_ptr<int> wp3(sp);
weak_ptr<int> wp4;
wp4 = sp;
weak_ptr<int> wp5;
wp5 = wp3;

return 0;

}


1. **`weak_ptr<int> wp1;`构造了一个空`weak_ptr`对象**
2. **`weak_ptr<int> wp2(wp1);`通过一个空`weak_ptr`对象构造了另一个空`weak_ptr`对象**
3. **`weak_ptr<int> wp3(sp);`通过一个`shared_ptr`对象构造了一个可用的`weak_ptr`实例对象**
4. **`wp4 = sp;`通过一个`shared_ptr`对象构造了一个可用的`weak_ptr`实例对象(这是一个隐式类型转换)**
5. **`wp5 = wp3;`通过一个`weak_ptr`对象构造了一个可用的`weak_ptr`实例对象**


* **通过调用`std::weak_ptr`类提供的`use_count()`方法可以获得当前所观测资源的引用计数**


####  2.常用函数



> 
> 1. **通过调用`std::weak_ptr`类提供的`expired()`方法来判断观测的资源是否已经被释放**
> 2. **通过调用`std::weak_ptr`类提供的`lock()`方法来获取管理所监测资源的`shared_ptr`对象**
> 3. **通过调用`std::weak_ptr`类提供的`reset()`方法来清空对象,使其不监测任何资源**
> 
> 
> 


* 利用**`weak_ptr可以解决shared_ptr的一些问题`**



> 
> 1. 返回管理this的shared\_ptr
> 2. 解决循环引用问题
> 
> 
> 




**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/8431c967581943628f913e95b6a748b2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251449&x-signature=OpFfyPDi6GoHdRM7Ak6zoLSsRUc%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6f3e441d391c4f1e86c91390825494f8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771251449&x-signature=%2Fc4iJCBAZJki%2BsJ3goLfFBEM7IA%3D)

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**