C++智能指针简介

举报
yd_274589494 发表于 2023/07/27 17:36:30 2023/07/27
【摘要】 @TOC 前言这篇文章将为大家带来智能指针,很多人都听过指针但是智能指针对于大家来说可能会很陌生。 一、C语言和C++中的动态内存申请在C语言使用malloc进行动态内存的申请在C++中使用new进行动态内存的申请C语言: int *p = (int*)malloc(4);C++ int *p = new int;在C语言和C++中使用malloc和new进行动态内存的申请,最终返回的都是指...

@TOC


前言

这篇文章将为大家带来智能指针,很多人都听过指针但是智能指针对于大家来说可能会很陌生。

一、C语言和C++中的动态内存申请

在C语言使用malloc进行动态内存的申请
在C++中使用new进行动态内存的申请
C语言:

	int *p = (int*)malloc(4);

C++

	int *p = new int;

在C语言和C++中使用malloc和new进行动态内存的申请,最终返回的都是指针类型。
我们申请了一段空间就必须要释放,否则就会发生内存泄漏。
在C语言和C++中分别使用free和delete进行内存的释放。
C语言:

	free(p);

C++

	delete p;

这样看起来只要遵守申请了内存就进行释放那就不会出现什么问题了。但是很多人申请内存后就会忘记释放,或者对同一块内存空间进行多次释放。这样就会导致很严重的BUG。
所以我们需要引入一个新的概念智能指针,智能指针可以自动释放申请到的内存,而且还保证不能多次释放同一块内存空间。

二、智能指针的创建

这里我们使用自定义类创建一个智能指针。
在析构函数中释放掉申请的内存,当程序结束时,动态申请的内存也就被释放了,这样就保证了内存不会被释放的问题了。

class Test
{
public:
	Test()
	{
		cout << "Test()" << endl;
	}
	~Test()
	{
		cout << "~Test()" << endl;
	}
};

class point
{
	Test* mp;
public:
	point(Test* p = NULL)
	{
		mp = p;
	}
	point(const point& obj)
	{
		mp = obj.mp;
		const_cast<point&>(obj).mp = NULL;
	}
	point& operator = (const point& obj)
	{
		if (this != &obj)
		{
			delete mp;
			mp = obj.mp;
			const_cast<point&>(obj).mp = NULL;
		}
	}
	Test& operator * ()
	{
		return *mp;
	}
	Test* operator -> ()
	{
		return mp;
	}
	~point()
	{
		delete mp;
	}
};


int main()
{
	point p = new Test();

	point p1(p);
	
	return 0;
}

这里还重载了->和*操作符保证了可以和指针一样的使用方法。

总结

智能指针使用起来是非常方便的,有了智能指针我们就可以避免动态内存申请时出现内存泄漏等问题了。大家下去多理解一下智能指针,这个在以后的工程开发当中还是很有用的,有什么地方不懂的大家可以留言或者私信。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。