内存管理(——高质量程序设计语言C/C++第16章)
内存的分配方式:
1.静态存储区分配:全局变量,static变量等,在程序编译时已经分配了存储内存,在程序运行的整个期间一直存在
2.程序的堆栈上:程序的局部变量,包括程序的形参等,只存在于程序的运行期间
3在堆heap上分配的:动态内存分配,malloc或者new
常见的内存错误:
(1)内存分配未成功,却使用它了。记得malloc时要判断返回的是否是NULL,若为NULL则说明动态分配内存失败
(2)内存分配成功了要记得初始化,malloc完了
calloc :(元素个数,元素大小),calloc在分配完内存后会初始化为0
realloc:(指针,新的大小),修改已经分配过的内存的大小,扩大或者缩小,若是扩大会在后面添加,不会改变原来的数据
malloc:(字节大小),不会自己进行初始化
(3)内存分配成功了,但在访问时越界了,超出了分配的内存的大小
(4)忘记释放掉动态分配的内存,或者只是释放了一部分,这样函数每调用一次都会丢失一次内存,会内存泄露,最后程序崩溃
(5)已经将内存给free掉了,但是没有把指针指向NULL,变成了野指针,还在使用它,会出现不可预料的情况。
指针的参数是如何传递的
(1)不要把函数的参数为指针的作为开辟动态内存的指针
例如: void getmemory(int* ptr)
{ ptr=(int*)malloc(sizeof(int)*10);}
在这里当调用这个函数时,传入的实参时,拷贝一个指针变量ptr的值,给他,然后在函数内开辟内存时,相当于改变这个实参的值(即地址)
对于形参时没有变化了。
这里可以使用指向指针的指针或者指针的引用。
函数的return时不要返回“栈内指针”,即返回指向在程序堆栈上分配的内存,当返回时,内存被释放了,所以没有任何意义。
内存管理(——高质量程序设计语言C/C++第16章)的更多相关文章
- 编程精粹--编写高质量C语言代码(3):自己设计并使用断言(二)
接着上一遍文章<<编程精粹--编写高质量C语言代码(2):自己设计并使用断言(一)>>,继续学习怎样自己设计并使用断言,来更加easy,更加不费力地自己主动寻找出程序中的错误. ...
- 指针,数组,字符串的区别(高质量程序设计指南C++/C语言第7章)
指针: 指针是变量,和平时的那些变量没有本质的差异,不同的只是它的值和类型,.,即解释方式 二进制层面:指针的值是内存单元的地址,而变量是引用内存单元值的别名 语言层面:指针的值就是变量的地址. 对象 ...
- 编程精粹--编写高质量C语言代码(4):为子系统设防(一)
通常,子系统都要对事实上现细节进行隐藏,在进行细节隐藏的同一时候.子系统为用户提供了一些关键入口点. 程序猿通过调用这些关键的入口点来实现与子系统的通信.因此假设在程序中使用这种子系统而且在其调用点加 ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
- 高质量程序设计指南C/C++语言——内存管理
• free()和delete只是把指针所指的内容给释放掉,并没有把指针本身删掉.指针被free()或delete以后其地址仍然不变(不等于NULL),只是该地址对应的内存是垃圾——p成了野指针.如果 ...
- 高质量程序设计指南C/C++语言——C++/C程序设计入门
1.在C++/C中,全局变量(extern或static)存放在程序的静态数据区中,在程序进入main()之前创建,在main()结束之后销毁,因此在我们的代码中根本没有机会初始化它们,于是语言及其实 ...
- 《高质量程序设计指南:C++/C语言》面试题整理
本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用 语法,不涉及 数据结构. 算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软 ...
- 高质量程序设计指南C/C++语言——C++/C程序设计入门(4)
*switch结构的break语句只是一个“jmp”指令,其作用就是跳到switch结构的结尾处 *标准C++/C语言提供3种循环:do/while.while和for,它们都在条件表达式为TRUE( ...
- 高质量程序设计指南C/C++语言——malloc/free使用要点
随机推荐
- 原生js的容易忽略的相似点(一)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- HDU 5381 The sum of gcd (技巧,莫队算法)
题意:有一个含n个元素的序列,接下来有q个询问区间,对每个询问区间输出其 f(L,R) 值. 思路: 天真单纯地以为是道超级水题,不管多少个询问,计算量顶多就是O(n2) ,就是暴力穷举每个区间,再直 ...
- COGS 2098. Asm.Def的病毒
★☆ 输入文件:asm_virus.in 输出文件:asm_virus.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持 ...
- SQLite_安装
SQLite -安装 zero-configuration SQLite闻名的特性,这意味着不需要复杂的设置或管理.本章将带你通过设置SQLite的过程在Windows.Linux和Mac OS X. ...
- vue 异步请求数据后,用v-if,显示组件,这样初始化的值就在开始的时候传进去了
请求到数据才会有的一个组件,并把数据传进组件中 https://www.cnblogs.com/LuckyWinty/p/6246698.html
- Java练习demo 20190402 优惠券扣减
实体类: package org.jimmy.autosearch2019.pojo; import java.math.BigDecimal; public class TestEntity2019 ...
- Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]
问题场景: 在使用表单向Action传递数据的时候, 遇到了这个问题, 导致了空指针异常. 问题描述: 10:14:56.622 [http-nio-8080-exec-45] ERROR com.o ...
- css--css选择器,伪类
前戏 前面我们说过CSS规则由选择器和声明组成,我们要给标签设置属性,那我们就要找到对应的标签,CSS选择器可以帮我们找到我们需要的标签 css选择器有: 标签选择器 类选择器 ID选择器 全局选择器 ...
- windows定时执行python脚本
from:http://blog.csdn.net/Gpwner/article/details/77882131
- Uncaught ReferenceError: 板栗 is not defined at HTMLButtonElement.onclick (view:1)
对JS传值一直以为都是随便传过去就行,直到今天遇到了中文传值的问题 中文传值不能够需要在调用的位置加 对于要传的值加单引号或者双引号 比如说下面这个样子,我这里还还记反斜杠注释 '<button ...