智能指针

动态内存与智能指针

*爱你&永不变心* 提交于 2019-12-27 21:37:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 1.生命周期 全局对象: 程序启动时分配,程序结束时销毁 局部自动对象: 执行流进入其定义的块时分配,执行流退出其定义的块时销毁 局部static对象: 程序启动时分配(但在其定义的块或作用域内起作用),程序结束时销毁 动态分配的对象: 生命周期与创建地点无关,只有当显示的被释放时,才会被销毁 智能指针:标准库定义,用于管理动态分配的内存,当一个对象应该被释放时,指向它的智能指针可以确保自动的释放它 2.内存分类 静态内存: 用于存储局部static对象、类的static数据成员、全局变量 栈内存: 用于存储局部非static对象 堆内存(内存池): 用于存储动态分配的对象——动态分配的对象,其生命周期由程序控制,例如使用new或delete 3.动态内存 动态内存使用过程中容易产生的问题 内存泄露: 使用后忘记释放内存 引用非法内存: 在尚有指针引用内存的情况下就释放它 使用动态内存的原因: 程序不知道自己需要使用多少对象 程序不知道所需对象的准确类型 程序需要在多个对象间共享底层数据——若两个对象共享底层数据,当某个对象销毁时,我们不能单方面的销毁底层数据 4.智能指针 智能指针和常规指针直接的区别:智能指针能够自动释放所指向的内存(类似java中的垃圾回收机制),而常规指针不能。

Chromium的智能指针/引用计数/Callback/Bind

风格不统一 提交于 2019-12-27 21:35:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这四个东西对使用者来说不难,看懂代码注释里的例子即可,预计1小时左右看懂全部。要去理解其设计思想的话最需要掌握的是模板类的使用,但一般使用者完全不用关心怎么设计的。 使用者的学习路径: 1.智能删除指针scoped_ptr 用作对普通指针的转储,防止忘记delete或不知道哪里delete。它跟引用计数没有关系。 头文件的注释就是使用示例 http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr.h template <class T, class D = base::DefaultDeleter<T> > class scoped_ptr 其中Deleter可以被替换,默认的Deleter区分是要delete普通指针还是指针数组,或者用free函数删除malloc的内存。 2. ScopedVector http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_vector.h 在析构时会delete其元素的vector,知道它的行为即可。 3.带引用计数的类 http://src.chromium.org/viewvc/chrome/trunk

【C++】智能指针简述(四):shared_ptr

六眼飞鱼酱① 提交于 2019-12-27 21:34:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>   在开始本文内容之前,我们再来总结一下,前文内容:   1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾.   2.auto_ptr防止拷贝后析构释放同一块内存,采用"转移所有权"的方法.(实际开发中auto_ptr并不实用)   3.scoped_ptr与auto_ptr类似,但是它与auto_ptr最大的区别是:它不能转移所有权,即就是禁止拷贝/赋值!(当然,我们也探讨了C++中禁止拷贝对象的技术,在此不赘述)   回顾完前文内容后,我们今天来讨论shared_ptr.   我们虽然有了scoped_ptr,但在实际开发过程中,我们的确要是想对智能指针进行拷贝,那scoped_ptr就鞭长莫及了.   那么,我们回到原始的问题:对智能指针进行拷贝,会出现什么情况?   我们在第二篇文章也分析了:如果对智能指针不进行特殊处理,在析构时,会将同一块内存释放多次,程序会崩溃!   因此,我们 要想对智能指针进行拷贝,就必须做一些特殊的处理,使得析构函数只释放一次内存.   此时,如果探究过深浅拷贝的同学,可能心中已经有了答案:用引用计数!!!(深浅拷贝问题,以后我会讨论,不是本文重点)   考虑到有些童鞋可能不知道什么是引用计数,那我就在这里解释一下:   在引用计数中

【C++】智能指针简述(三):scoped_ptr

痴心易碎 提交于 2019-12-27 21:19:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容.   首先, 智能指针 采用RAII机制,通过对象来管理指针, 构造 对象时,完成 资源的初始化 ; 析构 对象时,对 资源进行清理及汕尾 .    auto_ptr ,通过 转移管理权 来完成对象的拷贝与赋值,在 实际开发中并不实用 .   回顾完智能指针的背景及auto_ptr的特性之后,本文来介绍scoped_ptr的实现原理及特性.    scoped_ptr 与auto_ptr类似,但最大的区别就是它 不能转让管理权 .也就是说, scoped_ptr禁止用户进行拷贝与赋值 .   诶?当我了解到这里的时候,那么问题来了:scoped_ptr是通过什么方法来做到禁止用户进行拷贝与赋值呢?   换句话说: C++中有什么方法可以禁止一个类进行拷贝构造和赋值呢?   那么我第一时间想到的是:既然禁止你进行拷贝和赋值,那我不写相应函数不就行了?   在C++中, 如果你不定义拷贝构造函数/赋值运算符重载函数 的话,当你 在调用时 , 系统会自动默认生成相应的函数 .   但, 系统默认生成的函数 ,完成的仅仅是值的拷贝,即 浅拷贝 !(当然,深浅拷贝的问题,就不在这里多说了,以后再谈.)   也就是说

智能指针auto_ptr详解

孤街醉人 提交于 2019-12-27 07:40:50
主要内容转自http://www.cppblog.com/SmartPtr/archive/2007/07/05/27549.html 1. 智能指针auto_ptr的引入 auto_ptr是C++标准库中的智能指针模板类,头文件<memory> auto_ptr的出现,主要是为了解决“有异常抛出时发生内存泄漏”的问题。如下的简单代码是这类问题的一个简单示例。 int* p = new int(100); try { doSomething(); cout << *p << endl; delete p; } catch(exception& e) { } 当doSomething();部分抛出异常,将导致指针p所指向的空间得不到释放而导致内存泄露。auto_ptr的引入解决了这类问题。 2. auto_ptr的源代码(未可读性进行了少许改动的源码) 1 namespace std 2 { 3 template<class T> 4 class auto_ptr 5 { 6 private: 7 T* ap; 8 public: 9 10 // constructor & destructor ----------------------------------- (1) 11 explicit auto_ptr (T* ptr = 0) throw() : ap(ptr){}

C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

时光毁灭记忆、已成空白 提交于 2019-12-27 07:38:15
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉。 即程序员每次 new 出来的内存都要手动 delete,否则会造成内存泄露, 有时我们已经非常谨慎了 , 然防不胜防: 流程太复杂,程序员忘记 delete; 异常导致程序过早退出,没有执行 delete的情况屡见不鲜。 1 void FunTest() 2 { 3 int *p = new int[10]; 4 FILE* pFile = fopen("1. txt", "w"); 5 if (pFile == NULL) 6 { 7 return; //如果pFile == NULL则p指向的空间得不到释放 8 } 9 // DoSomethint() ; 10 if (p != NULL) 11 { 12 delete[] p; 13 p = NULL; 14 } 15 } 16 void FunTest2() //异常导致程序提前退出 17 { 18 int *p = new int[10]; 19 try 20 { 21 DoSomething(); 22 } 23 catch(. . .) 24 { 25 return; 26 } 27 delete[] p; 28 }

内存管理之智能指针unique_ptr&weak_ptr

妖精的绣舞 提交于 2019-12-27 07:37:50
unique_ptr: 1.unique_ptr与shared_ptr不同,某个时刻只能有一个unique_ptr指向给定的对象,当unique_ptr被销毁时,其所指向的对象也被销毁,和shared_ptr一样,unique_ptr默认使用delete释放指向的对象 2.unique_ptr初始化 1.不初始化,返回一个内容为nullptr的unique_ptr unique_ptr<类型> 指针名; 2.使用内置类型指针直接初始化 unique_ptr<类型> 指针名(内置类型指针p); 这里的p --> 类型* p = new 类型() unique_ptr<类型> 指针名(new<类型>())//unique_ptr与new结合使用 3.unique_ptr独占指向的对象,不支持赋值和拷贝操作 例子: unique_ptr<string> p1(new string("hello,world")); // 正确,直接初始化 unique_ptr<string> p2(p1); // 错误,unique_ptr不支持拷贝操作 unique_ptr<string> p3; // 正确,返回一个内容为nullptr的unique_ptr p3 = p1; // 错误,unique_ptr不支持赋值操作 4.了解reset()和release()方法 虽然不能拷贝或者赋值

智能指针之 unique_ptr

淺唱寂寞╮ 提交于 2019-12-27 07:36:46
  对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们 需要时刻记得释放,且不能重复释放,释放后不能再去使用. .. 因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了, 智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放 ,对动态内存做到一个比较好的管理   unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作   unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()   本次实现,将unique_ptr的基本接口进行了实现,基本包括了unique_ptr的功能 (编译平台:Linux centos 7.0 编译器:gcc 4.8.5 )   使用std::unique

C++智能指针 unique_ptr

北战南征 提交于 2019-12-27 07:36:31
C++智能指针 unique_ptr unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory (非memory.h)中, 命名空间为 std. 标准库早期版本中定义了 auto_ptr, 它具有 unique_ptr 的部分特征, 但不是全部, 例如, 不能在容器中保存 auto_ptr, 也不能从函数中返回 auto_ptr. 基于这些原因, 应该尽量使用 unique_ptr, 而不是 auto_ptr, 使用 unique_ptr 替换 auto_ptr. 基本用法: std::unique_ptr<A> up1; up1.reset(new A(3)); std::unique_ptr<A> up2(new A(4)); A* p = up2.release(); delete p; std::unique_ptr<A> up3(new A(11)); std::unique_ptr<A> up4 = std::move(up3); up4 = nullptr;//显式销毁所指对象,同时智能指针变为空指针。与u_s2.reset()等价 成员函数 (1) get 获得内部对象的指针, 由于已经重载了()方法, 因此和直接使用对象是一样的.如 unique_ptr

智能指针shared_ptr的用法

让人想犯罪 __ 提交于 2019-12-27 07:35:41
原文链接: https://www.cnblogs.com/jiayayao/archive/2016/12/03/6128877.html   为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer)。   智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。   C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件<memory>。   shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,删除所指向的堆内存。shared_ptr内部的引用计数是安全的,但是对象的读取需要加锁。 shared_ptr的基本用法 初始化   可以通过构造函数、std::make_shared<T>辅助函数和reset方法来初始化shared_ptr: #include "stdafx.h" #include <iostream> #include <future> #include <thread> using namespace