php网站带数据库,属性词 关键词 核心词,百度怎么发帖做推广,建设企业网站官网下载中心当智能指针管理的内存对应的引用计数变为 0 的时候#xff0c;这块内存就会被智能指针析构掉了。另外#xff0c;我们在初始化智能指针的时候也可以自己指定删除动作#xff0c;这个删除操作对应的函数被称之为删除器#xff0c;这个删除器函数本质是一个回调函数#xff…当智能指针管理的内存对应的引用计数变为 0 的时候这块内存就会被智能指针析构掉了。另外我们在初始化智能指针的时候也可以自己指定删除动作这个删除操作对应的函数被称之为删除器这个删除器函数本质是一个回调函数我们只需要进行实现其调用是由智能指针完成的。
代码如下:
#include iostream
#include memory
#include string
using namespace std;class Test
{
public:Test(){cout construct endl;}Test(int x) :m_num(x){cout construct x x endl;}Test(string str){cout construct str str endl;}~Test(){cout destruct endl;}void setValue(int v){m_num v;}void print(){cout m_num m_num endl;}private:int m_num;
};int main()
{shared_ptrTest ppp(new Test(100), [](Test *t){//释放内存的操作cout --------------------- endl;delete t;});return 0;}测试结果: 如果我们通过智能指针管理一块数组内存的时候它自带的删除器是删除不掉的这个时候我们就必须自己提供一个删除器。
代码如下:
#include iostream
#include memory
#include string
using namespace std;class Test
{
public:Test(){cout construct endl;}Test(int x) :m_num(x){cout construct x x endl;}Test(string str){cout construct str str endl;}~Test(){cout destruct endl;}void setValue(int v){m_num v;}void print(){cout m_num m_num endl;}private:int m_num;
};int main()
{shared_ptrTest p1 (new Test[5]);return 0;}测试结果: 代码如下:
#include iostream
#include memory
#include string
using namespace std;class Test
{
public:Test(){cout construct endl;}Test(int x) :m_num(x){cout construct x x endl;}Test(string str){cout construct str str endl;}~Test(){cout destruct endl;}void setValue(int v){m_num v;}void print(){cout m_num m_num endl;}private:int m_num;
};int main()
{//shared_ptrTest p1 (new Test[5]);shared_ptrTest p1(new Test[5], [](Test * t) {delete[] t;});return 0;}测试结果: 在删除数组内存时除了自己编写删除器也可以使用 C 提供的 std::default_delete() 函数作为删除器这个函数内部的删除功能也是通过调用 delete 来实现的要释放什么类型的内存就将模板类型 T 指定为什么类型即可。具体处理代码如下
代码如下:
int main()
{//shared_ptrTest p1 (new Test[5]);//shared_ptrTest p1(new Test[5], [](Test * t) {// delete[] t;//});shared_ptrTest p2(new Test[5], default_deleteTest[]());return 0;}测试结果: 另外我们还可以自己封装一个 make_shared_array 方法来让 shared_ptr 支持数组代码如下:
#include iostream
#include memory
using namespace std;template typename T
shared_ptrT make_share_array(size_t size)
{// 返回匿名对象return shared_ptrT(new T[size], default_deleteT[]());
}int main()
{shared_ptrint ptr1 make_share_arrayint(10);cout ptr1.use_count() endl;shared_ptrchar ptr2 make_share_arraychar(128);cout ptr2.use_count() endl;return 0;
}/*作者: 苏丙榅
链接: https://subingwen.cn/cpp/shared_ptr/#2-%E6%8C%87%E5%AE%9A%E5%88%A0%E9%99%A4%E5%99%A8
来源: 爱编程的大丙
*/不过在C以后shared_ptr支持了可以管理数组类型的地址了。
代码如下:
int main()
{shared_ptrTest[] ptr4(new Test[3]);return 0;}测试结果: