Bootstrap

std::shared_ptr 用法

描述:
       std::shared_ptr是c++标准库中的一个模板类,它提供了自动化的内存管理,通过共享引用计数的方式来管理动态分配的对象。这意味着多个std::shared_ptr可以共享同一个对象,并在不再需要时自动释放它。

构造:

#include <iostream>
#include <memory>

class CTest
{
public:
	CTest(int n) {
		m_n = n;
		std::cout << "构造 " << this << std::endl;
	}
	~CTest() {
		std::cout << "析构 " << this << std::endl;
	}
	
	void Show() {
		std::cout << m_n << std::endl;
	}

private:
	int m_n;
};

int main()
{
	//构造1
	std::shared_ptr<CTest> ap1(new CTest(1));
	ap1->Show();

	//构造2
	std::shared_ptr<CTest> ap2 = std::make_shared<CTest>(2);
	ap2->Show();

	//构造3
	CTest* p1 = new CTest(3);
	std::shared_ptr<CTest> ap3(p1);
	ap3->Show();

	return 0;
}

自定义删除器:
       在某些情况下,我们可能需要在std::shared_ptr销毁对象时执行自定义的清理操作。这可以通过提供自定义的删除器函数或函数对象来实现。删除器函数将在对象销毁时被调用,并负责执行所需的清理操作。

#include <iostream>
#include <memory>

class CTest
{
public:
	CTest() {
		m_n = 0;
		std::cout << "构造 " << this << std::endl;
	}
	~CTest() {
		std::cout << "析构 " << this << std::endl;
	}
	
	void Show() {
		std::cout << m_n << std::endl;
	}

private:
	int m_n;
};

int main()
{
	CTest* p = new CTest[10];
	std::cout << "--------------------" << std::endl;
	std::shared_ptr<CTest> ap(p, [](CTest* ptr) {delete[] ptr; });

	return 0;
}
;