13.5.1. 定义智能指针类

#include <iostream>
#include<string>
#include<set>
using namespace std;

//智能指针的使用

//智能指针类
class U_ptr
{
	friend class hashptr;
	int *ip;//在hashptr中实际的需要定义的指针成员
	size_t use;//使用次数的计数
	U_ptr(int *p):ip(p),use(1){}//合成构造函数
	~U_ptr(){delete ip;}//析构函数
};

/*
接受一个指针和一个 int 值的 HasPtr 构造函数使用其指针形参创建一个
新的 U_Ptr 对象。HasPtr 构造函数执行完毕后,HasPtr 对象指向一个新分配
的 U_Ptr 对象,该 U_Ptr 对象存储给定指针。新 U_Ptr 中的使用计数为 1,
表示只有一个 HasPtr 对象指向它。
复制构造函数从形参复制成员并增加使用计数的值。复制构造函数执行完毕
后,新创建对象与原有对象指向同一 U_Ptr 对象,该 U_Ptr 对象的使用计数加
1。
*/
class hashptr
{
private:
	U_ptr *p;
	int vi;
public:
	hashptr(int *pi,int i):p(new U_ptr(pi)),vi(i){}
	hashptr(const hashptr& org):p(org.p),vi(org.vi){++p->use;}
	hashptr& operator=(const hashptr&);
	~hashptr(){if(--p->use==0)delete p;}

	int* get_ptr()const{return p->ip;}
	int get_int()const{return vi;}

	void set_ptr(int *newp){p->ip=newp;}
	void set_int(int newint){vi=newint;}

	int get_ptr_vi(){return *p->ip;}
	int set_ptr_vi(int i){*p->ip=i;}

};

//赋值操作
/*
在这里,首先将右操作数中的使用计数加 1,然后将左操作数对象的使用计
	数减 1 并检查这个使用计数。像析构函数中那样,如果这是指向 U_Ptr 对象的
	最后一个对象,就删除该对象,这会依次撤销 int 基础对象。将左操作数中的
	当前值减 1(可能撤销该对象)之后,再将指针从 rhs 复制到这个对象。赋值
	照常返回对这个对象的引用。
	这个赋值操作符在减少左操作数的使用计数之前使 rhs 的使
	用计数加 1,从而防止自身赋值。
*/
hashptr& hashptr::operator=(const hashptr& org)
{
	++org.p->use;
	if(--p->use==0)
		delete p;
	++p->use;
	p=org.p;
	vi=org.vi;
	return *this;
}

int main()
{

	//cout<<a[1]<<endl;
	system("pause");
	return 1;
}

  

时间: 2024-10-10 10:25:18

13.5.1. 定义智能指针类的相关文章

C++自学笔记_定义智能指针类_《C++ Primer》

包含指针的类要特别注意复制控制,原因是复制指针只复制指针中的地址,而不会复制指针所指向的对象. C++类采用以下3种方法之一管理指针成员: (1) 指针成员采取常规指针型行为.这样的类具有指针所有的缺陷但是无需特殊的复制控制. (2) 类可以是实现“智能指针”行为.指针所指向的对象是共享的,但类能够防止悬垂指针. (3) 类采取值型行为.指针所指向的对象是唯一的,由每个类对象单独管理. 这里总结第(2)种方法——采用定义智能指针类 智能指针类的思想在于: 第(1)种方法中,所有的对象中的指针都直

【C++】智能指针类和OpenCV的Ptr模板类

智能指针类 引用计数 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象.引用计数为0时,删除对象. 其基本使用规则是: 每次创建类的新对象时,初始化指针并将引用计数置为1.当对象作为另一对象的副本而创建时,复制构造函数复制指针并增加与之相应的引用计数的值.对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数的值(如果引用计数减至0,则删除对

智能指针类

//智能指针类 //---------------------------------------- //1.基数据放在使用计数类中 //实际类指向->使用计数类->基数据 //使用计数类 class U_ptr{ friend class Hasptr;//友元类 int *ip;//这个就是要保护的基数据 size_t use; U_ptr(int *p):ip(p),use(1){} ~U_ptr(){delete ip;} }; class Hasptr//实际类 { public:

智能指针类模板(五十)

我们之前在 C++ 的学习中学习了有关智能指针的知识.那么智能指针的意义是现代 C++ 开发库中最重要的类模板之一:是 C++ 中自动内存管理的主要手段,它能够在很大程度上避开内存相关的问题.在 STL 标准库中的智能指针为 auto_ptr,它的特点是:1.生命周期结束时,销毁指向的内存空间:2.不能指向堆数组,只能指向堆对象(变量):3.一片堆空间只属于一个智能指针对象:4.多个智能指针对象不能指向同一片堆空间. 下来我们就来使用下 auto_ptr 智能指针 #include <iostr

C++智能指针类模板

1.智能指针本质上是一个对象,这个对象可以像原生的一样来进行使用.原因是智能指针对象对应的类中,将指针相关的操作都进行了重载操作处理,所以才会达到这种像是原生的效果. 2.智能指针的意义: 现在C++开发库中最重要的类模板之一 C++中自动内存管理的主要手段 能够在很大程度上避开内存相关的问题 3.在QT中开发库中也提供了智能指针类模板,在STL标准库中也提供了,在c++的标准库忘了什么名了中也提供了智能指针类模板.所以智能指针类模板在C++中的地位很重要 4.STL中的智能指针类模板 auto

第61课 智能指针类模板

1. 智能指针的意义 (1)现代C++开发库中最重要的类模板之一 (2)C++中自动内存管理的主要手段 (3)能够在很大程度上避开内存相关的问题(如内存泄漏.内存的多次释放等) 2. STL中的智能指针 (1)auto_ptr智能指针 ①生命周期结束时,销毁指向的内存空间 ②只能用来管理单个动态创建的对象,而不能管理动态创建的数组.即不能指向堆数组,只能指针堆对象(变量) int* pn = new int[100]; auto_ptr<int> ap(pn); //auto_ptr指向堆数组

[CareerCup] 13.8 Smart Pointer 智能指针

13.8 Write a smart pointer class. A smart pointer is a data type, usually implemented with templates, that simulates a pointer while also providing automatic garbage collection. It automatically counts the number of references to a SmartPointer<T*>

Item 13:使用对象(智能指针)来管理资源 Effective C++笔记

Item 13: Use objects to manage resources. 熟悉智能指针的人肯定不会对此觉得陌生.利用C++中对象自动析构的特性,自动地释放资源. C++编译器并未提供自动的垃圾回收机制,因此释放资源的责任落在了开发者的头上. 我们被要求总是成对地使用new和delete,例如: Investment *pInv = createInvestment(); ... delete pInv; createInvestment这样的方法属于工厂方法(factory funct

13.5. 管理指针成员的13.5.2. 定义值型类 方法

#include <iostream> #include<string> #include<set> using namespace std; //定义值类型 /* 复制构造函数不再复制指针,它将分配一个新的 int 对象,并初始化该对 象以保存与被复制对象相同的值.每个对象都保存属于自己的 int 值的不同副 本.因为每个对象保存自己的副本,所以析构函数将无条件删除指针. 赋值操作符不需要分配新对象,它只是必须记得给其指针所指向的对象赋新 值,而不是给指针本身赋值 换