c++学习笔记——智能指针

智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象。

智能指针共有三种:1、shared_ptr允许多个指针指向同一个对象;2、unique_ptr独占所指向的对象;3、weak_ptr是一个伴随类,它是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。

下面是一个在网上看到的智能指针的实现原理代码:

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:
	HasPtr(int *p, int i) :
		ptr(new U_Ptr(p)), val(i) {
		cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl;
	}
	HasPtr(const HasPtr& orig) :
		ptr(orig.ptr), val(orig.val) {
		++ptr->use;
		cout << "HasPtr copy constructor called ! " << "use = " << ptr->use
				<< endl;
	}
	HasPtr& operator=(const HasPtr&);
	~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 get_ptr_val() const {
		return *ptr->ip;
	}
	void set_ptr_val(int i) {
		*ptr->ip = i;
	}
private:
	U_Ptr *ptr;
	int val;
};
HasPtr& HasPtr::operator =(const HasPtr &rhs) {     //注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值
	++rhs.ptr->use;
	if (--ptr->use == 0)
		delete ptr;
	ptr = rhs.ptr;
	val = rhs.val;
	return *this;
}
时间: 2024-10-04 03:38:53

c++学习笔记——智能指针的相关文章

c++ 11学习笔记--智能指针

C++ 98的 std::auto_ptr已经被彻底遗弃了,取而代之的是unique_ptr.shared_ptr与weak_ptr.大部分时候我们自己手动申请内存方式内存都是没有问题的,问题是如果程序很大了之后,一个复杂的对象,多次拷贝的代价非常高,很多地方都会使用到,只存在一份拷贝显然是最好的,这个时候对象生命周期的管理就会很复杂,所以c++引入了智能指针. 任何事物都会有两面性. Shared_ptr 摘录于Effective C++, 3rd Edition, Item 17: 在 st

学习笔记:指针之C

因为某些原因来好好的将C重新梳理一遍,过去一年也是个渣,好在还能重新来过.将C和指针中指针一节学习了三四次,再将后面的习题做了一做.现在再好好回顾一下.至于对错就不过多评价. 指针的确是C的特点之一,从最初接这玩意就没把它弄的很明白.据说把它真正吃透的人也不多.这也只是我的学习笔记.指针,记得当初C语言老师说的一点,就是地址,其他就没啥印象了.自从自己做题就是记住了这点,指针就是地址,访问相应内存空间的值是间接访问,要用' * ',也叫解引用指针. 通过C和指针这本参考书,我才知道我们是用变量来

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

【STL学习】智能指针之shared_ptr

前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指针,这种指针让我们不再需要为两个对象或更多对象共享的对象的生命周期而编写复杂的逻辑(写起来有点绕口),当被共享的对象引用计数降为0时,被共享对象被自动析构. 引用计数指针分为插入式(instrusive)和非插入式(non-instrusive)两种.前者要求它所管理的类提供明确的函数或数据成员用于

C++Primer 学习笔记之指针和引用

1.引用概念 引用引入了对象的一个同义词.定义引用的表示方法与定义指针相似,只是用&带起了*. 例如:Point pt1(10,10); Point &pt2 = pt1;//定义pt2为pt1的引用.通过这样的定义,pt1和pt2表示同意对象,需要特别强调的是引用并不是产生对象的副本,仅仅是对象的同义词.因此,当下面的语句执行后: pt1.ofset(2,2); pt1和pt2都具有了(12,12): 引用必须在定义的时候马上初始化,因为它必须是某个东西的同义词.你不能先定义一个引用后才

C# 指针学习笔记之指针类型

大学的时候学过C++.C,最近工作也不是很忙,就想起看看C#中的指针,看看.回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型 在不安全的上下文中,类型可以是指针类型以及值类型或引用类型.指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed but not recommended 下列类型都可以是指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.d

c++ primer笔记------智能指针

智能指针的陷阱 基本规范: 1.不使用相同的内置指针值初始化(或reset)多个智能指针.  double free 2.不delete get() 返回的指针.  double free 3.不使用get() 初始化或reset另一个智能指针.  double free 4.如果你使用get() 返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了.   空悬指针 5.如果你使用智能指针管理的资源不是new分配的内存,记住传递给它一个删除器.    非new类型指针需要自己指定

C++细节学习之智能指针auto_ptr和tr1::shared_ptr

为什么要用智能指针? 我们知道在C++中,资源管理是个头疼的问题.资源管理最常做的就是内存管理.而指针用起来如果忘记归还,就会导致内存泄露. 比如: class Oneclass{}; int func(){ Oneclass* one=new Oneclass; if(!one)return 1; delete one; return 0; } 可见,上面代码中,我们可以发现delete并没什么卵用,函数没有执行到delete,而是直接返回了1:最好的办法就是不用指针,使用对象来管理资源,因为

深入学习c++--智能指针

1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个指针同时只能有一个使用者使用 4. weaked_ptr: 与shared_ptr搭配使用 1.1 shared_ptr 参考:https://zh.cppreference.com/w/cpp/memory/shared_ptr std::shared_ptr 是通过指针保持对象共享所有权的智能指