C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++智能指针

C++基本用法实践之智能指针详解

作者:寡人正在Coding

为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,下面小编就来和大家简单聊聊C++中智能指针的基本用法吧

概述

c++效率较高的一个原因是我们可以自己定制策略手动申请和释放内存,当然,也伴随着开发效率降低和内存泄漏的风险。为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,有三种:

智能指针的类型决定了何时销毁和释放内存。当智能指针的生命周期结束时,它会自动清理其所有权的内存。这就避免了内存泄漏,使代码更安全、更健壮。
但是智能指针的使用,也要注意一些问题:

智能指针是一个对象,实现是非入侵式的。关于他们的大概的原理:

用法举例

参考测试项目代码ModernCppTest/modrenc_smart_pointer.cpp主要包含:

#include "ModernCppTestHeader.h"
#include <memory>

#define LOG_UNIQUE_PTR_VALID(ptr) if(ptr) LOG(#ptr << " unique_ptr valid"); else LOG(#ptr << " unique_ptr invalid")
#define LOG_WEAK_PTR_IF_VALID(ptr, exp) if(auto tp = p2.lock()) exp else LOG(#ptr << " weak_ptr invalid")

namespace n_smart_pointer {
	class Obj {
	public:
		Obj(int ID) : ID(ID) { LOG("Obj addr " << this << " ID " << ID << " Create"); }
		~Obj() { LOG("Obj addr " << this << " ID " << ID << " Release"); }

		int ID;
	};

	class Item {};
}

using LocaObj = n_smart_pointer::Obj;

void smart_pointer_test()
{
	LOG_FUNC();


	LOG_TAG("std::shared_ptr 共享指针");
	{
		{
			std::shared_ptr<LocaObj> p1 = std::make_shared<LocaObj>(1);
			{
				std::shared_ptr<LocaObj> p2 = p1;
				LOG_VAR_DESC(p1->ID, " p1->ID");
				LOG_VAR_DESC(p2->ID, " p2->ID");
				LOG("p2 离开作用域");
			}
			LOG("p1 离开作用域");
		}
	}


	LOG_TAG("std::shared_ptr 共享指针的声明方式");
	{
		std::shared_ptr<LocaObj> p1(new LocaObj(1));
		std::shared_ptr<LocaObj> p2 = std::make_shared<LocaObj>(2);
		std::shared_ptr<LocaObj> p3(p2);
	}


	LOG_TAG("std::unique_ptr 唯一指针");
	{
		{
			std::unique_ptr<LocaObj> p1;
			{
				std::unique_ptr<LocaObj> p2 = std::make_unique<LocaObj>(1);
				LOG_VAR_DESC(p2->ID, " p2->ID");

				LOG("唯一指针转移控制权使用=运算符报错,须使用std::move()");
				// std::unique_ptr<LocaObj> p1 = p2;
				p1 = std::move(p2);
				LOG_VAR_DESC(p1->ID, " p1->ID");

				LOG("测试被std::move的p2是否还有效,可以看到 无效");
				LOG_UNIQUE_PTR_VALID(p2);
				LOG("p2 离开作用域, ID为1的Obj没有析构");
			}

			LOG("p1 离开作用域, ID为1的Obj析构");
		}
	}


	LOG_TAG("std::unique_ptr 唯一指针的声明方式");
	{
		std::unique_ptr<LocaObj> p1(new LocaObj(1));
		std::unique_ptr<LocaObj> p2 = std::make_unique<LocaObj>(2);
		std::unique_ptr<LocaObj> p3(std::move(p2));
	}


	LOG_TAG("std::weak_ptr 弱指针");
	{
		std::shared_ptr<LocaObj> p1 = std::make_shared<LocaObj>(1);
		std::weak_ptr<LocaObj> p2 = p1;

		LOG_VAR_DESC(p1->ID, " p1->ID");
		LOG_WEAK_PTR_IF_VALID(p2, LOG_VAR_DESC(tp->ID, " p2->ID"););

		LOG("p1 reset Obj对象被释放");
		p1.reset();

		LOG("p2 弱指针失效");
		LOG_WEAK_PTR_IF_VALID(p2, LOG_VAR_DESC(tp->ID, " p2->ID"););
	}
}

到此这篇关于C++基本用法实践之智能指针详解的文章就介绍到这了,更多相关C++智能指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文