int-C语言内存管理问题,要注重细节

问题描述

C语言内存管理问题,要注重细节

int pOld = (int) malloc( sizeof(int) );
int pNew = (int) malloc( sizeof(int) );
pOld=pNew;
free(pOld);
这样写代码,有什么问题?

解决方案

代码顺序需要调整一下,pOld在赋值成pNew之前就必须free掉,不然第一次malloc出来的内存块就没有任何指针指向它了,也就是说我们失去了回收它的途径,所以正确的代码应该像下面这样:

int pOld = (int) malloc( sizeof(int));
int pNew = (int) malloc( sizeof(int));
free(pOld);
pOld=pNew;

如果像之前的代码:

pOld=pNew;
free(pOld);

这样free掉的其实是新申请的那块内存,因为pOld此时已经被赋值,指向了第二次malloc的内存块。

解决方案二:

int *pOld = (int *) malloc( sizeof(int) );
int *pNew = (int *) malloc( sizeof(int) );
pOld=pNew;
free(pOld);


解决方案三:

这样写会有内存泄漏,这里指释放了pOld,没有释放pNew,

然后就是如果要规范一点最好还是用指针,不要用整形来代替指针地址

int *pOld = (int *) malloc( sizeof(int) );
int *pNew = (int *) malloc( sizeof(int) );
//TODO something.
free(pNew);
free(pOld);

解决方案四:

pOld ,pNew都需要释放,不然就有内存泄漏。

时间: 2024-12-21 21:57:30

int-C语言内存管理问题,要注重细节的相关文章

bbs段-C语言内存管理,BBS段内存分配

问题描述 C语言内存管理,BBS段内存分配 #include<stdio.h> int a; int b; int c=1; int d=1; void main(){ printf("%dn",sizeof(int)); printf("%p,%p,%p,%pn",&a,&b,&c,&d); } 运行结果: 4 00404090,004040A0,00402000,00402004 想要问的是:程序是不是给变量a,b分配

C语言内存管理 为什么难检查数组访问越界

理论上,数组是一个简单的数据结构:当你需要访问其中的一个元素时,只需要给出该元素的索引位置,就能对该元素进行读或者写操作.这句话中也隐含了一个问题,那就是你需要访问一个元素时,都需要提供一个索引位置.使用索引位置来找元素通常是一个代价很高的计算,尤其是当元素的大小不是2的整数次幂时: 在诸如表达式++a[i], 在地址递增的过程中,其计算地址的代价可以轻松超过5倍于a[i]的地址的代价. 在至少50年的时间里,编译器开发人员一直在努力让访问数组元素变得更快.其中很大一部分的工作都围绕想下面这种循

C语言内存分配管理常见bug

标准C库提供了4个内存管理函数:malloc.calloc.realloc和free. bug1 调用free释放p指向的内存块之后,p就是一个悬挂指针--指向逻辑上不存在的内存的指针.如果引用这个悬挂指针,会导致不可预见的错误. ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM); ... free(p);// p = NULL; ... *p = "..."; bug2 释放空闲内存,破坏内存管理函数所用的数据结构. El

理解C语言——从小菜到大神的晋级之路(12)——动态内存管理

      本节视频链接:点击这里         在前面的内容中,我们通常使用数组来利用一段连续的内存空间来保存数据.我们前面用到的数组基本保存在栈内存中,其内存空间由系统自动分配和释放,使用非常方便,也不用担心内存管理的问题.但是在栈中分配的数组存在一个严重的问题,就是它的长度必须在建立时明确指定,且无法再运行时修改.为了防止运行时出现内存空间不够的问题,在编程时就必须定义一个非常大的数组来容纳理论上可能的最多个的元素,这样就会导致内存利用率底下,因为如果元素个数较少时大部分的内存空间都被浪

嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.7 内存管理之栈(stack)

1.7 内存管理之栈(stack) 1.7.1 什么是栈 我们常常听人说堆栈,但大家一定要明确区分:堆就是堆,栈就是栈.我们平常说的堆栈一般是指栈.那栈的本质是什么?栈是一种数据结构,C语言中使用栈来保存局部变量(注意,下文中不强调的情况下,局部变量均指非静态局部变量).栈是被发明出来管理内存的,是一种维护内存的机制,这就是栈的本质. 1.7.2 栈管理内存的特点(小内存.自动化) 栈的特点是入口即出口,只有一个口,另一个口是堵死的.所以先进去的后出来,也就是先进后出,而与栈特点相对的就是先进先

模拟实现C语言中的内存管理_C 语言

这里模拟了C语言中的内存管理,当我们要创建或者使用一个对象时,那么这个对象会调用retain方法,计数+1,当我们要释放对象,我们会调用free,这里注意要对计数记性判断,如果是0的话,那么就会销毁. #import <Foundation/Foundation.h> int cnt = 0; void fun (charchar * p) { printf("%c\n",p[0]); } charchar * retain1(charchar * p) { //retai

养成良好的C++编程习惯之内存管理的应用详解_C 语言

开篇导读    虽然本系列文章定位为科普读物,但本座相信它们不但适合新手们学习借鉴,同时也能引发老鸟们的反思与共鸣.欢迎大家提出宝贵的意见和反馈 ^_^ 在开篇讲述本章主要内容之前,本座首先用小小篇幅论述一下一种良好的工作习惯 -- 积累.提炼与求精.在工作和学习的过程中,不断把学到的知识通过有效的方式积累起来,形成自己的知识库,随着知识量的扩大,就会得到从量变到质变的提升.另外还要不断地对知识进行提炼,随着自己知识面的扩大以及水平的提升,你肯定会发现原有知识库存在着一些片面.局限.笨拙甚至错误

C# 语言规范--1.4 自动内存管理

规范 手动内存管理要求开发人员管理内存块的分配和回收.手动内存管理可能既耗时又麻烦.在 C# 中提供了自动内存管理,使开发人员从这个繁重的任务中解脱出来.在绝大多数情况下,自动内存管理可以提高代码质量和开发人员的工作效率,并且不会对表达能力或性能造成负面影响. 示例 using System; public class Stack {    private Node first = null;    public bool Empty {       get {          return

JVM内存管理:JAVA语言的内存管理概述

引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不