栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

智能指针第一篇——auto

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

智能指针第一篇——auto

目录

1.RAll:

1.1原理:

1.2为什么使用智能指针,不使用裸指针:

2.c++17已经移除的auto_ptr:

2.1智能指针的内存分布:

 2.2如何解决->和*来调用成员方法(运算符重载)

2.3reset()函数:

2.4auto_ptr的缺点:


1.RAll:

使用局部对象来管理资源的技术称为资源获取即初始化;这里的资源主要是指操作系统中有限的东西如内存,网络套接字,网络套接字,互斥量,文件句柄等等,局部对象是指存储在栈的对象,它的生命周期是由操作系统来管理的,无需人工介入。

1.1原理:

资源的使用一般经历三个步骤:

  1. 获取资源(创建对象)
  2. 使用资源
  3. 销毁资源(析构对象)

 但是资源的销毁往往是程序员经常忘记的一个环节,所以程序界就想如何在程序员中让资源自动销毁呢?解决问题的方案是:RAlI,它充分的利用了C++语言局部对象自动销毁的特性来控制资源的生命周期。

1.2为什么使用智能指针,不使用裸指针:

裸指针不能确定指向是一个对象还是一组对象。

认识一下各种指针:

#include

using namespace std;

class Object
{
	int value;
public:

	Object(int x = 0) :value(x) { cout << "Create Object" << endl; }
	~Object() { cout << "Destory Object"; }
	void Value()
	{
		cout << value;
	}

};
void Destory(Object* op)
{
	delete op;
}
int main()
{
    Object*
	int* ip;//野指针
	Object* op = NULL;//空指针
	op = new Object(10);
	op->Value();
	Destory(op);
    //悬空指针
	return 0;

}

2.c++17已经移除的auto_ptr:

c++11中已经弃用。

简单实现:

#include

using namespace std;

class Object
{
	int value;
public:
	Object(int x = 0) :value(x) { cout << "Create Object" << this<
class my_auto_ptr
{
private:
	bool Owns;//拥有权
	_Ty* _Ptr;
public:
	my_auto_ptr(_Ty* p = NULL) :Owns(p != NULL), _Ptr(p) {}
	~my_auto_ptr()
	{
		if (Owns)
		{
			delete _Ptr;
			Owns = false;
		}
		_Ptr = NULL;
	} 
	
	_Ty* get()const { return _Ptr; };
	_Ty& operator*()const
	{
		return *(get());
	}
	_Ty* operator->()const
	{
		return get();
	}
};
void fun()
{
	my_auto_ptrobj(new Object(10));
	cout << sizeof(obj)<Value() << endl;
	cout << (*obj).Value() << endl;
}
int main()
{
	fun();
	return 0;
}

 

2.1智能指针的内存分布:
my_auto_ptrobj(new Object(10)); 

 2.2如何解决->和*来调用成员方法(运算符重载)
    _Ty* get()const { return _Ptr; };
	_Ty& operator*()const
	{
		return *(get());
	}
	_Ty* operator->()const
	{
		return get();
	}

get()返回_Ptr指针。重载*,表示对_Ptr的解引用,即Object对象本身。重载->,表示直接返回_Ptr。

2.3reset()函数:

指向另一个对象。

void reset(_Ty*p=NULL)
	{
		if (Owns)
		{
			delete(_Ptr);
		}
		 _Ptr = p;
		 
	}
int main()
{
	//fun();
	my_auto_ptrobj(new Object(10));
	obj.reset(new Object(100));
	return 0;
} 

2.4auto_ptr的缺点:

意义不明确:不能确定所有权到底如何划分。

    my_auto_ptrobaj(new Object(10));
	my_auto_ptrobbj(new Object(200));
	
    //所有权不明确
	my_auto_ptrobcj(obaj);
	obbj = obaj; 

STL中容器库都不带auto_ptr玩。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号