智能指针的问题(现阶段不懂呢)

#include<iostream>
using namespace std;

// 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针
// 这个类的所有成员都是private,我们不希望普通用户使用U_Ptr类,所以它没有任何public成员
// 将HasPtr类设置为友元,使其成员可以访问U_Ptr的成员
class U_Ptr
{
	friend class HasPtr;
	int *ip;
	size_t use;
	U_Ptr(int *p) : ip(p), use(1)
	{
		cout << "U_ptr constructor called !" << endl;
	}
	~U_Ptr()
	{
		delete ip;
		cout << "U_ptr distructor called !" << endl;
	}
};

class HasPtr
{
public:
	// 构造函数:p是指向已经动态创建的int对象指针
	HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i)
	{
		cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl;
	}

	// 赋值构造函数:赋值成员并将使用计数加1
	HasPtr(const HasPtr& orig) : ptr(orig.ptr), val(orig.val)
	{
		++ptr->use;
		cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl;
	}

	// 赋值操作符   HasPtr& HasPtr::operator = (const HasPtr &rhs)
	HasPtr& operator=(const HasPtr&rhs);

	// 析构函数:如果计数为0,则删除U_Ptr对象
	~HasPtr()
	{
		cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl;
		if (--ptr->use == 0)
			delete ptr;
	}

	// 获取数据成员
	int *get_ptr() const
	{
		return ptr->ip;
	}
	int get_int() const
	{
		return val;
	}

	// 修改数据成员
	void set_ptr(int *p) const
	{
		ptr->ip = p;
	}
	void set_int(int i)
	{
		val = i;
	}

	// 返回或修改基础int对象
	int get_ptr_val() const
	{
		return *ptr->ip;
	}
	void set_ptr_val(int i)
	{
		*(ptr->ip) = i;
	}
private:
	U_Ptr *ptr;   //指向使用计数类U_Ptr
	int val;
};
HasPtr& HasPtr::operator = (const HasPtr &rhs)  //注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值
{
	// 增加右操作数中的使用计数
	++rhs.ptr->use;//这里相当于++(rhs.ptr->use)
	// 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象
	if (--ptr->use == 0)
		delete ptr;
	this->ptr = rhs.ptr;   // 复制U_Ptr指针
	this->val = rhs.val;   // 复制int成员
	return *this;
}

int main(void)
{
	int *pi = new int(42);
	HasPtr *hpa = new HasPtr(pi, 100);    // 构造函数
	HasPtr *hpb = new HasPtr(*hpa);     // 拷贝构造函数
	HasPtr *hpc = new HasPtr(*hpb);     // 拷贝构造函数
	HasPtr hpd = *hpa;     // 拷贝构造函数  

	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
	hpc->set_ptr_val(10000);
	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
	hpd.set_ptr_val(10);
	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
	delete hpa;
	delete hpb;
	delete hpc;
	cout << hpd.get_ptr_val() << endl;
	system("pause");
	return 0;
}

  

时间: 2024-11-17 07:02:03

智能指针的问题(现阶段不懂呢)的相关文章

enote笔记法使用范例(2)——指针(1)智能指针

要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在<C++ Primer>这样解释的,“通过定义一个类来封装资源的分配和释放,可以保证正确释放资源” 核心:C++98提供了语言机制:对象([!值语意对象])在超出作用域,,析构函数会被自动调用 [如果构造函数中抛出异常,则不会调用析构函数.只有构造函数正确地执行,构建对象成功,才会调用析构函数] &l

Binder学习笔记(十一)—— 智能指针

轻量级指针 Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见.打开frameworkds/rs/cpp/util,RefBase.h和StrongPointer.h两个文件,代码多读几遍都能读懂,可是串起来总感觉摸不到骨架,把不住主线.闭上眼零零星星的点串不成一条线.究其原因应该是此处使用了模式,最好先剔除掉业务层的皮肉,把模式的骨架摸个门清,再回来看代码就会势如破竹了. 不是多

话说智能指针发展之路

从RAII说起 教科书里关于"动态创建内存"经常会提醒你,new一定要搭配delete来使用,并且delete掉一个指针之后,最好马上将其赋值为NULL(避免使用悬垂指针). 这么麻烦,于是乎,这个世界变成11派人: 一派人勤勤恳恳按照教科书的说法做,时刻小心翼翼,苦逼连连: 一派人忘记教科书的教导,随便乱来,搞得代码处处bug,后期维护骂声连连: 最后一派人想了更轻松的办法来管理动态申请的内存,然后悠闲唱着小曲喝着茶- (注:应该没人看不懂11是怎么来的--就是十进制的3的二进制形式

C++ 智能指针的使用

测试环境:win7, vs2012 如果未安装boost,请参考:http://blog.csdn.net/alex_my/article/details/17630685 涉及智能指针:shared_ptr, weak_ptr, scoped_ptr, auto_ptr 其它:enable_shared_from_this 总调用函数: testSmartPointer() 可以将其放在main()中运行.解释在代码中. #include <vector> #include <iost

C/C++——跟我重写智能指针auto_ptr模版类

第一次使用auto_ptr的时候感觉很好用,但是对内部原理根本不懂,心里不知道这东西到底是个什么东东,总是感觉这东东比较陌生.今天有时间来简单实现一下该类模版auto_ptr,实现了该模版类的主要功能,可以让大家了解一下这个东东内部到底是个什么情况. 栈对象和堆对象的区别: 首先,看一下两种类对象的区别,一个是在栈上分配空间,另一个是在堆上分配空间. 如果看到这里,你不清楚堆和栈的区别.那我也不解释了,自行Google..(如果你想baidu也不拦你) 1.先测试栈上分配的对象 #include

细说智能指针

提到指针,我们就会想到指针的高效,当然,滥用指针也会为我们带来许多的潜在bug.提到指针,我们就会想到内存泄漏.比如,使用指针后忘记释放,久而久之,堆空间就会全部使用完,那么会带来很大的危害.再比如,两个指针指向同一片内存区域,我们对同一片区域进行了多次释放,同样会造成内存泄漏.为了方便大家的理解,我们先来模拟一下,使用指针却忘记释放带来的危害.首先,我们要定义一个类.这次,还是定义女朋友类吧(之前写过一篇<细说C++的友元>用的就是女朋友类,这次还用这个吧,方便说明问题,更何况我们这群马畜怎

堆栈里的悄悄话——智能指针

栈里的对象 "构造完毕,请睁开眼吧!",迷迷糊糊中,听着这个声音,我睁开了眼睛,一位小哥映入眼帘. “你是谁?我是谁?这又是什么地方?”,我的大脑一片空白. “你是一个C++对象,这里是栈空间.我是创建你的线程,你先待着,一会儿会用到你,拜-” “唉,等一下...”,还没等我回过神,小哥已经走远. 环顾四周,这个叫栈的地方,有好多好多的对象,大小不一,不远处还有一个巨无霸对象足足有好几千字节. “哇!好大一个对象!”,我不禁发出了惊叹. “一看就是没见过世面的,这才多小的个头,就在那大

c++ 踩坑大法好 智能指针

1,智能指针是啥? 普通指针基本上就是一个变量,它的的生命周期和变量的作用域有关,局部变量在走出作用域以后就会销毁,全局变量可能程序运行完了就销毁了. new出来的指针和普通指针的区别在于,new出来的那块内存区域是不会自动被释放的,需要你手动调用delete才能释放,然而由于种种原因,new----delete这俩节奏总是出状况,于是有人想到了自动回收的指针 智能指针根本上是一个class,你可以生成一个class实例用以管理一块内存,内存中放上你想放的东西,一方面该实例记录着该内存的地址,类

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)

写了很多篇关于vector的博客,其实vector很便捷,也很简单.但是很多易错的问题都是vector中的元素为智能指针所引起的.所以决定开始写一写关于智能指针的故事,尤其是unique_ptr指针的故事. 这是个开始,就让我们使用std::unique_ptr代替new operator吧! 还是用程序说话: #include<iostream> int main() { while (true) int *x = new int; } 看下任务管理器中的内存: 此时使用智能指针unique