智能指针

C++智能指针

北战南征 提交于 2019-11-27 18:37:09
智能指针的使用和原理 RAII RAII(resource acquisition is initaliation) 是一种利用 对象生命周期 来控制程序资源( 内存,文件句柄,网络连接, 互斥量等) 的技术 在对象构造时获取资源 ,接着控制对资源的访问使之在对象的生命周期内始终保持有效, 最后在对象析构的时候释放资源 .实际上是把管理资源的任务给给一个对象,此时就可以: 不需要显式的释放资源 采取这种方式,对象所需的资源在其声明周期内始终保持有效 智能指针的原理 //在模板类中重载*,->.使smartptr可以实现指针一样的使用 template < class T > class SmartPtr { public : SmartPtr ( T * ptr = nullptr ) : _ptr ( ptr ) { } ~ SmartPtr ( ) { if ( _ptr ) delete _ptr ; } T & operator * ( ) { return * _ptr ; } T * operator - > ( ) { return _ptr ; } private : T * _ptr ; } ; struct Date { int _year ; int _month ; int _day ; } ; int main ( ) { SmartPtr < int >

【M28】智能指针

若如初见. 提交于 2019-11-27 01:16:27
1、什么是智能指针?   所谓智能指针就是,看起来,用起来,感觉起来都像原始指针,但是提供了更多功能。 2、使用智能指针取代原始指针,可以获得更多的控制权。如下:   a、在构造和析构的时候,可以做一些事。   b、在复制和赋值的时候,可以做一些事。   c、在解引用的时候,可以做一些事。 3、智能指针可以对不同类型的指针进行封装,因此智能指针是一个模板类。 4、智能指针对原始指针封装,内含一个原始指针,为了用起来像指针,重载->和*,->返回原始指针,*返回对象的引用,两个重载操作符都不改变智能指针,因此是const成员方法。 5、考虑auto_ptr,拥有权转移,auto_ptr的copy构造会修改rhs,因此rhs不是const T&,而是T&。C++默认是传值,导致拥有权转移,如果期望拥有权不转移,使用传引用。 6、解引用操作符*,必须返回引用,不能返回对象。因为解引用操作符,可能返回T的子类。如果返回对象,首先导致对象复制,其次可能照成对象切割,失去多态功能。 7、判断智能指针是否为NULL。对于原始指针,使用if(pa == null),但是对于智能指针,不能这样使用,因为智能指针是个对象。怎么解决这个问题呢?   a、增加isNull方法,缺点是与原始指针的用法不一致。   b、为了与原始指针的用法一致,增加隐式类型转换操作符,operator void*()

C++标准库(五)之智能指针源码剖析

牧云@^-^@ 提交于 2019-11-26 20:16:01
C++标准库(五)之智能指针源码剖析 _Mutex_base template<_Lock_policy _Lp> class _Mutex_base { protected: enum { _S_need_barriers = 0 }; }; template<> class _Mutex_base<_S_mutex : public __gnu_cxx::__mutex { protected: enum { _S_need_barriers = 1 }; }; _Sp_counted_base template<_Lock_policy _Lp = __default_lock_policy> class _Sp_counted_base : public _Mutex_base<_Lp> { public: _Sp_counted_base() : _M_use_count(1), _M_weak_count(1) { } virtual ~_Sp_counted_base() { } //nothrow virtual void _M_dispose() = 0; // nothrow virtual void _M_destroy() { delete this; } virtual void* _M_get_deleter(const std::type_info&)

智能指针之atuo_ptr源码剖析

邮差的信 提交于 2019-11-26 19:34:13
由于c++没有垃圾回收机制,像堆只能手动开辟内存,手动释放,像栈只能系统开辟,系统释放,于是智能指针出现了,它实现了内存的手动开辟,系统释放,防止了内存泄漏问题; 我们知道, 栈对象在离开其作用域的时候, 会自动调用析构函数, 所以, 可以考虑把某一栈对象与某一堆内存绑定,且在其析构函数中释放堆内存, 那么, 在该栈对象离开作用域时, 堆内存自动释放, 这就是智能指针(本质是栈对象)的原理。 这个栈对象装得像指针一样, 所以我们称之为智能指针, 其实, 它不过就是个普通的栈对象而已。 在c++ 98 中只有auto-ptr,这个指针是不完善的,现在几乎都要被摒弃了,但我们还是要去了解一下他的思想,明白为何要被摒弃的呢?以及在c++11上又是如何对他如何改进的呢? //自动指针即auto_ptr,不同于scoped_ptr指针的是自动指针会转移使用权 //在进行赋值或者拷贝构造之后,原来的auto_ptr会失去对所管指针的拥有权,并且将自己的指针赋为NULL //同时,在赋值和拷贝构造之后,原来的auto_ptr的指针会指向NULL,也是它最大的弊端之一; #include <iostream> using namespace std; // 简单类 class A { public: void fun() { } }; template<class T> // 类模板 class

智能指针

折月煮酒 提交于 2019-11-26 17:52:32
针对C++没有实现自己的内存回收机制,所以它引入了智能指针进行内存回收,力求做到内存由用户开辟,系统回收这样就能最大程度避免内存泄漏的发生。具体做法是以智能指针(类)生成一个对象(栈上生成)对开辟的内存(堆上)进行自主回收管理。 C ++ 98 中引入了 auto_ptr智能指针 ,其宗旨是 维护内存所有权的唯一性 ,具体的做法就是对一个已经开辟内存块只能有一个智能指针指向,如果有新的智能指针对象指向该内存就讲就得智能指针指向断开。 template<typename T> class Auto_Ptr { public: Auto_Ptr(T* ptr) :mptr(ptr){} ~Auto_Ptr() { delete mptr; mptr = NULL; } Auto_Ptr(Auto_Ptr<T>& rhs) //所有权更替 { mptr = rhs.Release(); } Auto_Ptr<T>& operator=(Auto_Ptr<T>& rhs) //所有权更替 { if (this != &rhs) { delete mptr; mptr = rhs.Release(); } return *this; } T& operator*() { return *mptr; } T* operator->() { return mptr; } private: T*

C++——智能指针

走远了吗. 提交于 2019-11-26 16:44:51
智能指针的目的: 解决内存泄漏和指针悬挂。 内存泄漏: 不再使用的内存没有得到释放。 悬挂指针: 悬挂指针也叫野指针,是未初始化或未清零的指针。与空指针(NULL)不同,悬挂指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。 悬挂指针的成因主要有两种: 指针变量没有被初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。 智能指针auto_ptr(只能指向动态内存)(也是unique_ptr的一种) auto_ptr是c++标准库的类模板,auto_ptr对象通过初始化指向new创建的动态内存,auto_ptr对象即为这块内存的拥有者,一块内存不能有两个拥有者。 (C++98标准) 当auto_ptr对象的生命周期结束时,析构函数会将auto_ptr对象拥有的动态内存自动释放,防止内存泄漏。 #include <iostream> #include <memory> using namespace std; class Test { public: Test(int a = 0 )

智能指针

此生再无相见时 提交于 2019-11-26 15:55:13
weak_ptr weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。即使有weak_ptr指向对象,对象也还是会被释放,因此,weak_ptr的名字抓住了这种智能指针“弱”共享对象的特点。 来源: https://www.cnblogs.com/bootblack/p/11325121.html

C++ 面试准备

岁酱吖の 提交于 2019-11-26 08:11:49
引用与指针的区别和联系 指针是实体,会为其分配内存,且可以允许多级指针 引用创建时必须初始化且不可变(只能初始化一次故不用const),指针创建时无须初始化但最好初始化以防止NULL 二者自增(++)结果不同,引用是值进行自增,而指针是地址进行自增; sizeof 结果不同,sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小 引用访问是直接访问原对象,指针则是间接访问 作为参数给函数传参不同,引用传参会比指针传参更安全,原因见下一问 联系 引用的内部使用指针实现的 引用是受了限制的指针 为什么传引用比传指针安全? 引用在创建的同时必须初始化,保证引用的对象是有效的,所以不存在NULL引用;而指针在定义的时候不必初始化,所以,指针则可以是NULL,可以在定义后面的任何地方重新赋值 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象 引用的创建和销毁并不会调用类的拷贝构造函数 因为不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,所以比指针安全。 由于 const 指针仍然存在空指针,并且有可能产生野指针,所以还是不安全。解决方案是智能指针。 介绍一下智能指针 智能指针,将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求)

细说智能指针

蓝咒 提交于 2019-11-26 01:07:32
提到指针,我们就会想到指针的高效,当然,滥用指针也会为我们带来许多的潜在bug。 提到指针,我们就会想到内存泄漏。比如,使用指针后忘记释放,久而久之,堆空间就会全部使用完,那么会带来很大的危害。再比如,两个指针指向同一片内存区域,我们对同一片区域进行了多次释放,同样会造成内存泄漏。 为了方便大家的理解,我们先来模拟一下,使用指针却忘记释放带来的危害。首先,我们要定义一个类。这次,还是定义女朋友类吧(之前写过一篇《细说C++的友元》用的就是女朋友类,这次还用这个吧,方便说明问题,更何况我们这群码畜怎么会有女朋友呢,没有女朋友只能自己创建了,哈哈哈哈)。 女生都喜欢自拍,尤其是漂亮的女生。所以,女生会有很多照片,对吧。那么,我们创建的这个女朋友类,就让她有照片吧。当然了,你女朋友的照片肯定不会随便给别人的吧,所以要把picutre这个变量声明为private类型。既然,女生喜欢自拍,并且发朋友圈,也就是说,其他人虽然得不到她的照片,却可以通过她的朋友圈看到她的自拍,也就意味着我们可以通过一个public函数访问picture这个变量。那么,我们现在来写代码。 class Girlfriend{ private: int pictures; public: Girlfriend ( int i ){ cout << "Girlfriend ( int i ) " << endl; /