[C++11]共享智能指针shared_ptr指定删除器

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++11]共享智能指针shared_ptr指定删除器相关的知识,希望对你有一定的参考价值。

当智能指针管理的内存对应的引用计数变为 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_ptr<Test> 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_ptr<Test> 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_ptr<Test> p1 (new Test[5]);

	shared_ptr<Test> p1(new Test[5], [](Test * t) {
		delete[] t;
	});

	return 0;

}

测试结果:

在这里插入图片描述

在删除数组内存时,除了自己编写删除器,也可以使用 C++ 提供的 std::default_delete() 函数作为删除器,这个函数内部的删除功能也是通过调用 delete 来实现的,要释放什么类型的内存就将模板类型 T 指定为什么类型即可。具体处理代码如下:

代码如下:

int main()
{
	//shared_ptr<Test> p1 (new Test[5]);

	//shared_ptr<Test> p1(new Test[5], [](Test * t) {
	//	delete[] t;
	//});

	shared_ptr<Test> p2(new Test[5], default_delete<Test[]>());

	return 0;

}

测试结果:

在这里插入图片描述

另外,我们还可以自己封装一个 make_shared_array 方法来让 shared_ptr 支持数组,代码如下:

#include <iostream>
#include <memory>
using namespace std;

template <typename T>
shared_ptr<T> make_share_array(size_t size)
{
    // 返回匿名对象
    return shared_ptr<T>(new T[size], default_delete<T[]>());
}

int main()
{
    shared_ptr<int> ptr1 = make_share_array<int>(10);
    cout << ptr1.use_count() << endl;
    shared_ptr<char> ptr2 = make_share_array<char>(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_ptr<Test[]> ptr4(new Test[3]);

	return 0;

}

测试结果:

在这里插入图片描述

以上是关于[C++11]共享智能指针shared_ptr指定删除器的主要内容,如果未能解决你的问题,请参考以下文章

c++11智能指针(一) shared_ptr

[C++11]shared_ptr使用的注意事项(内存被重复析构,内存泄漏问题)

共享智能指针shared_ptr的实现

深入学习c++--智能指针

C++11 unique_ptr智能指针详解

深入学习c++--智能指针 weak_ptr(打破shared_ptr循环引用)