指针变量

【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就鞭长莫及了.   那么,我们回到原始的问题:对智能指针进行拷贝,会出现什么情况?   我们在第二篇文章也分析了:如果对智能指针不进行特殊处理,在析构时,会将同一块内存释放多次,程序会崩溃!   因此,我们 要想对智能指针进行拷贝,就必须做一些特殊的处理,使得析构函数只释放一次内存.   此时,如果探究过深浅拷贝的同学,可能心中已经有了答案:用引用计数!!!(深浅拷贝问题,以后我会讨论,不是本文重点)   考虑到有些童鞋可能不知道什么是引用计数,那我就在这里解释一下:   在引用计数中

两数之和(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.

指针作为函数的参数

假装没事ソ 提交于 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; 那么在将其初始化之前,无法使用此变量

第4章 变量、作用域和内存---JS红宝书书摘系列笔记

房东的猫 提交于 2019-12-27 10:16:59
一、基本类型和引用类型 ECMAScipt变量可能分为两种数据类型:基本类型和引用类型。 基本类型:指简单的数据段;包括Undefined、Null、Boolean、Number、String;可以操作保存在变量中值(栈内存),所以称为按值访问;不能添加属性。 引用类型:可能由多个值构成的对象;包括Arry、Object等;js不允许直接操作对象的内存(堆内存)空间,所以成为按引用访问;可以动态得添加/改变/删除引用类型值的属性和方法。 1.复制 1 var a=5; 2 var b=a; 3 console.log(a);//5 4 console.log(b);//5 5 a=3; 6 console.log(a);//3 7 console.log(b);//5 8 var arrA=[1,2,3]; 9 var arrB=arrA; 10 console.log(arrA);//[1,2,3] 11 console.log(arrB);//[1,2,3] 12 arrA[0]='x'; 13 console.log(arrA);//['x',2,3] 14 console.log(arrB);//['x',2,3] 上述代码中a、b为基本数据类型,arrA、arrB为引用类型。可以看出首先定义并初始化了变量a为5,再定义变量b,此时打印出来a和b都是5;改变a的值为3

智能指针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

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

go基础之--函数和map

我的未来我决定 提交于 2019-12-27 00:29:46
在整理函数之前先整理一下关于指针 指针 普通类型变量存的就是值,也叫值类型。指针类型存的是地址,即指针的值是一个变量的地址。 一个指针指示值所保存的位置,不是所有的值都有地址,但是所有的变量都有。使用指针可以在无序知道 变量名字的情况下,间接读取或更新变量的值。 获取变量的地址,用&,例如:var a int 获取a的地址:&a,&a(a的地址)这个表达式获取一个指向整形变量的指针,它的类型是整形指针(*int),如果值叫做p,我们说p指向x,或者p包含x的地址,p指向的变量写成 *p ,而*p获取变量的值,这个时候*p就是一个变量,所以可以出现在赋值操作符的左边,用于更新变量的值 指针类型的零值是nil 两个指针当且仅当指向同一个变量或者两者都是nil的情况才相等 通过下面小例子进行理解指针: 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func test() { 8 x := 1 9 // &x 获取的是变量x的地址,并赋值给p,这个时候p就是一个指针 10 p := &x 11 // p是指针,所以*p获取的就是变量的值,指针指向的是变量x的值,即*p为1 12 fmt.Println(*p) 13 // 这里*p 进行赋值,也就是更改了变量x的值,即实现不知道变量的名字更改变量的值 14 *p = 2 15 fmt.Println

12-26学习随笔:指针和内存

爱⌒轻易说出口 提交于 2019-12-26 23:40:44
12-26学习随笔:指针和内存 内存: 系统存储空间,32位系统通常为8个字节的内存地址 指针: 指针是一个变量,如同int a 类似,指针存储内容为地址。 如申明 int p; 那么变量为p,而不是 p; 指针声明: 指针变量的数据类型用来指定该指针所指向变量的类型(指针类型和所指向的变量类型相同): char *p; int *p; float *p; 空指针可以指向任意类型,执行指向类型后将强制转换: void *p; 指针赋值: 初始化赋值: int a=100; int *p=&a; 后期赋值 int a=100; int p; p=&a; 指针基本使用: 指针所指向地址+1: p+=1; 对于32位系统,指针+1代表内存地址+4(4 8); 取指向地址的值: int b; b=*p; 来源: CSDN 作者: 后海看海 链接: https://blog.csdn.net/liujieupup/article/details/103720622

指针

旧巷老猫 提交于 2019-12-26 18:20:53
前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。 为什么需要指针? 指针解决了一些编程中基本的问题。 第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果, 但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。 第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。 第三,有些操作必须使用指针。如操作申请的堆内存。还有: C语言中的一切函数调用中,值传递都是“按值传递(pass by value)”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。 指针是什么? 我们指知道:C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。