C/C++指针内存分配小细节
char *pc = NULL;
pc = new char[0];
pc[0] = '1';
相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而n=0时代表什么呢?
其实上面的程序编译、运行都是正确的。因为编译器识别到指定大小为0时,会自动为其分配1BYTE的内存空间。
尝试过的小伙伴会发现,给p[1]赋值也不会报错,原因留到后面讲*1。
但是,此时若想用delete [] p; 去释放内存空间就会报错,程序强制中断,因为编译器并没有真正意义上内指针变量分配内存,去释放肯定是不行的。
这就像对一个成功分配内存的指针变量,连续释放两次造成的错误,例子见后面*2。
好了,马上看一下成功分配内存的情况是怎么样的。
char *pc = NULL;
pc = new char[5];
pc[0] = '1';
这里的n=5,意味着给指针变量分配5个BYTE内存空间(因类型为char),当然不管是什么类型,指针变量本身均占4BYTE。
先来看上面遗留的第一个问题*1:此时不但可以给p[0]到p[4]赋值,还可以给后面的地址赋值,如p[5],p[10]等。
这就是C/C++完美之余的一个历史遗留缺陷,不进行越界检查。
导致编译没有任何问题,运行阶段有时一不小心也察觉不出,这就要求程序员养成良好的习惯:new后面必出现delete。
若我们在给p[5]或之后的地址赋过值,在运行到delete [] p;语句时,会报错,程序强制中断。错误原因如提示的信息:damage:after normal block。
这就是上面遗留的第二个问题*2:对同一个指针变量指向的内存释放两次,与释放一个没有成功分配内存或引用越界的指针变量类似,都是不允许的。
还有一个值得注意的地方:若new时n>0,delete后只是释放了原来内存地址中对应的值,指针变量仍然指向该内存地址,即:
仍可以赋值、取值进行运算,只是若没有重新赋值,取出的值为不确定值,换句话说就是,p成了传说中的野指针。
所以,这又是一个要求养成良好习惯的地方,看文章开头的地方,声明一个指针但未分配内存空间时,最好将其置为NULL。
这样做有两个好处:1、方便后面进行判断,if(!P){...}表示无内存分配,若当初没有将其置为NULL,则!p为真也代表不了什么;
2、在delete后,重新分配内存之前,将其置回为NULL,避免其成为野指针。
而对于malloc与free,情况类似,有兴趣的小伙伴可以尝试下。
刚开始学习这一块,有哪里不对的地方欢迎大家指出,谢谢!
C/C++指针内存分配小细节的更多相关文章
- 【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装
[送给在路上的程序猿] 对于一个开发人员而言,可以胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够运用到系统中.由此简化系统的开发,是其架构生涯的第一步. ...
- C指针的一些小细节
1 int *c;*c=4-->int *c;int b;c=&b;*c=4; 在使用指针之前,一定要将其初始化,当然,如果是赋予一个地址,就相当于使用的同时就进行了初始化.
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...
- TCMalloc源码学习(三)(小块内存分配)
线程本地cache 线程本地cache对应的是类 ThreadCache,每一个thread一个实例,初始化代码在static函数CreateCacheIfNecessary中, 在该线程第一次申请内 ...
- C动态内存分配(C与指针实例)
主要初步介绍malloc.free.calloc.realloc的基本.日后会有更详细的内容. malloc.free分别用于动态内存分配和释放. malloc会从内存池里提取一块合适的内存(连续的) ...
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- <c和指针>学习笔记5动态内存分配和预处理器
1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...
- 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)
就在近日,Facebook宣布开源了内部使用的C++底层库,总称folly,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能的需求. 这里是folly的github地址:https:// ...
随机推荐
- maven 仓库搜索添加需要的jar包
可用仓库网址: http://search.maven.org/#browse http://mvnrepository.com/ http://repository.sonatype.org/ind ...
- android中TimePicker和DatePicker的简单使用
package com.example.demo10; import java.util.Calendar; import android.support.v7.app.ActionBarActivi ...
- folly
一.简介 Folly是,Facebook于2012年6月初开源的一个基于C++11的C++组件库,提供了类似Boost库和std库的功能,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能 ...
- css常见问题
CSS: 1.垂直居中布局 (1)已知宽高 (2)未知宽高 https://segmentfault.com/q/1010000004073623 2.文字退格 text-indent: 4em; 3 ...
- 百度地图Api进阶教程-点击生成和拖动标注4.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 手机打开PC端网址自动跳转到手机站代码
<script>function uaredirect(murl){ try { if(document.getElementById("bdmark") != nul ...
- Linux登录出现modle is unknow
一.问题描述 登录linux系统发现控制台无法登录,即使输入正确用户名和密码,也无法登录,回车看到有一个错误“module is unknow”. 但是,ssh可以正常登录. 二.解决办法 ssh登录 ...
- codevs 2822 爱在心中
codevs 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同, ...
- [cb] Assetbundle打包(一)
一.简介 Unity的Assetbundle是Unity Pro提供的功能. 理解:Asset 资源,资产:Bundle :包,一批,捆:字面上的意思,就是把资源打包. 在项目中怎么使用Assetbu ...
- Loadrunner:场景运行较长时间后报错:Message id [-17999] was not saved - Auto Log cache is too small to contain the message.
loadrunner运行时间较长后,跑数据过程老是失败,有如下error: Message id [-17999] was not saved - Auto Log cache is too smal ...