指针

动态内存与智能指针

*爱你&永不变心* 提交于 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++中, 如果你不定义拷贝构造函数/赋值运算符重载函数 的话,当你 在调用时 , 系统会自动默认生成相应的函数 .   但, 系统默认生成的函数 ,完成的仅仅是值的拷贝,即 浅拷贝 !(当然,深浅拷贝的问题,就不在这里多说了,以后再谈.)   也就是说

两数之和(two sum)问题通用解法(map法和双指针)

岁酱吖の 提交于 2019-12-27 20:33:27
文章目录 1. [LeetCode01:two sum](https://leetcode.com/problems/two-sum/) 题意 思路1:map法 代码1: 思路2:双指针解法 代码2 小结 2. [LintCode607. Two Sum III - Data structure design](https://www.lintcode.com/problem/two-sum-iii-data-structure-design/my-submissions) 题意 思路 代码 3. 167. [Two Sum II - Input array is sorted](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/) 题意 思路 代码 4. LintCode587.Two Sum - Unique pairs 题意 思路 代码 5. [LeetCode15. 3Sum](https://leetcode.com/problems/3sum/) 题意 思路 代码 6. [LintCode-382. Triangle Count](https://www.lintcode.com/problem/triangle-count/description) 题意 思路 代码 7.

Python3学习笔记23-StringIO和BytesIO

落花浮王杯 提交于 2019-12-27 18:44:48
StringIO 很多时候数据读取不一定是文件,也可以在内存中 StringIO顾名思义就是在内存中读写str 要把str写入StringIO,我们需要先创建一个StringIO,然后像文件一样写入即可: from io import StringIO f = StringIO() f.write('Hello') f.write(' ') f.write('Word') print(f.getvalue()) #getvalue()方法用于获得写入的str 要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取: f = StringIO('Hello!\nHi!\nGoodbye!') while True: s = f.readline()#每行读取 if s == '':#当读取到空 break#终止读取 print(s.strip())#strip()去掉首尾空格 BytesIO StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。 BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes: from io import BytesIO f = BytesIO() f.write('中文'.encode('utf-8'))#写入的是经过utf-8编码的bytes

Python3 IO编程之StringIO和BytesIO

♀尐吖头ヾ 提交于 2019-12-27 18:44:08
  StringIO    很多时候,数据读写不一定是文件,也可以在内存中读写。   要把str写入StringIO,我们需要先创建一个StringIO,然后像文件一样写入即可 >>> from io import StringIO >>> f=StringIO() >>> f.write('hello') 5 >>> f.write(' ') 1 >>> f.write('world!') 6 >>> f <_io.StringIO object at 0x7f6bbc76e318> >>> f.getvalue() 'hello world!'   getvalue()方法用于获得写入后的str   要读取StringIO,可以用一个str初始化StringIO,然后像读文件一样读取 >>> f=StringIO('Hello!\nHi!\nGoodbye!') >>> while True: ... s=f.readline() ... if s=='': ... break ... print(s.strip()) ... Hello! Hi! Goodbye!   BytesIO   StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。   BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes: >

11. 盛最多水的容器

狂风中的少年 提交于 2019-12-27 18:01:25
一个典型的双指针题,定义左右指针表示盛水容器的高度,即height数组中较小的值,盛水量可表示为高度与两个指针之差的乘积,因此要求该乘积的最大值。指针初始值指向数组开头和结尾,为了获取最大的盛水量,应该使高度较小的指针向中间靠拢,循环结束条件为两个指针相等。 class Solution { public int maxArea ( int [ ] height ) { int left = 0 ; int right = height . length - 1 ; int max = 0 ; while ( left < right ) { int len = right - left ; max = Math . max ( max , len * ( Math . min ( height [ right ] , height [ left ] ) ) ) ; if ( height [ left ] > height [ right ] ) { right -- ; } else { left ++ ; } } return max ; } } 来源: CSDN 作者: codErVing 链接: https://blog.csdn.net/er_ving/article/details/103734502

指针作为函数的参数

假装没事ソ 提交于 2019-12-27 17:24:41
在 C/C++ 语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。 指针变量作为参数 也不例外 ,但是可以改变实参指针变量所指向的变量的值 例子如下: 当指针作为形参时,我们仅仅是用于改变指针所指向变量(实参)的值时,这是可以改变的。 int a = 3 ; int * p = & a ; void func1 ( int * val ) { * val = 10 ; } int main ( ) { cout << * p << endl ; //输出是3; func1 ( p ) ; cout << * p << endl ; //输出是10; } 但是要明确的是,当对指针本身进行操作时,其与普通的形参是一样的,没有任何特殊之处。 就是指针内存单元存放的的其指向地址的值。 int a = 3 ; int b = 9 ; int * p = & a ; void func1 ( int * val ) { val = & b ; } int main ( ) { cout << * p << endl ; //输出是3; func1 ( p ) ; cout << * p << endl ; //输出是3; /* 对指针本身所存储的变量的更改,只限于形参形式。 */ } 当指针作为形参,而我们要去对其进行实际的操作时

值类型和引用类型

こ雲淡風輕ζ 提交于 2019-12-27 14:05:34
值类型和引用类型 值类型 值类型这个概念经常出现在类似C#,JAVA等编程语言的书籍中."值类型"直接将内存存储在栈内,由系统自动释放资源的数据类型. 与值类型相对应的有引用类型.C#语言中还对应指针类型. 值类型编辑 每一种编程语言的值类型都有一些非常细小的不同.下文所指的内容仅仅是.NET框架中C#编程语言的值类型定义. 整体来说C#的值类型有: [1] 整型:Int; 长整型:long; 浮点型:float; 字符型:char; 布尔型:bool 枚举:enum 结构:struct 在C#中所有的值类型都继承自:System.ValueType 主要功能编辑 基于值类型的变量直接包含值。 [2] 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 所有的值类型均隐式派生自SystemValueType。 与引用类型不同,不能从值类型派生出新的类型。但与引用类型相同的是,结构也可以实现接口。 与引用类型不同,值类型无法包含null值。但是,可以为 null 的类型功能允许值类型分配给null。 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 中值类型编辑 在使用 C# 中的局部变量之前,必须对其进行初始化。 [3] int myInt; 那么在将其初始化之前,无法使用此变量