关于内存的动态分配和回收?

pc200300 2004-04-26 03:04:08
我写了一段如下代码:
int *pValue=NULL;

pValue=new int;

*pValue=120;

delete pValue;

*pValue=130;

int i=*pValue;
此时i的值为130,谁能详细讲解一下整个过程中内存的动态分配和回收,及delete后为什么还能再引用?把 new和delete换成malloc和free是同样的结果。
...全文
290 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
junkuang 2004-07-05
  • 打赏
  • 举报
回复
pValue = new int;//申请动态内存

delete pValue;//释放动态内存,但应特别注意,delete(free)只是把指针所指的内存给
释放掉,但并没有把指针本身干掉。所以,此时指针pValue并未设置成NULL,而是变成一个野指针,指向一块未知的内存

*pValue = 130;//赋值

int i = *pValue;//所以,最后i的值为130

把 new和delete换成malloc和free是同样的结果还是一样
talkingmute 2004-06-18
  • 打赏
  • 举报
回复
看看林锐写的那本《高质量程序设计指南》吧,你这种情况就是因为出现了“野指针”的。
因为delete之后,只是把指针指向的内存给释放掉,而指针本身还是指向那个地址的,至于那个地址存放的是什么内容,无人可知,这样的指针就是野指针,想避免这种情况的发生就把它指向的地址设为NULL,即是一个空指针,想用时再重新给它分配内存。
yahaha 2004-06-18
  • 打赏
  • 举报
回复
delete只是标识释放你的指针指向的内存,你的指针还是指向原来的地方,原来的内存区域可以被其他程序使用了,你后面的使用可能回产生错误,可以说他的值是130,说明了一种偶然,就是别的程序还没有用这块内存。安全的程序是在delete后将指针赋成NULL!
nicknide 2004-06-18
  • 打赏
  • 举报
回复
To zb1226
操作系统才不管指针的问题呢,它只是记录地址页而已的
而且在操作系统中,并没有指针这个东西的概念的,指针只是数据结构和高级语言结合的产物
zb1226 2004-06-18
  • 打赏
  • 举报
回复
可能这就是操作系统的内存分配管理。
它只是将内存分配表的占用标记由1设置为0而已
并没有清除此指针。
cat8162 2004-06-18
  • 打赏
  • 举报
回复
大家来解释一下:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>


void main(void)
{
int len;
char a[]={"yhhtes2222"};
char *s1;
char *s2;#include <string.h>
const char *str;

s1=a;

len=strlen(s1);
s2=(char *)malloc(len+1);
printf("%d\n",strlen(s2));
strcpy(s2,s1);
printf("%d,%d,%d\n",strlen(s2),strlen(a),strlen(s1));
printf("%s %d\n",s2,strlen(s2));

free(s2);
//s2=NULL;
exit(0);
}
为什么strlen(s2)总比strlen(a)大四个字节,free(s2)的时候,
malloc一定要(len+1)或大于(len+1);



Unknowm 2004-06-18
  • 打赏
  • 举报
回复
s2=(char *)malloc(len+1);
printf("%d\n",strlen(s2));
s2刚分配内存还没有初始化就调用strlen,其长度是不确定的

malloc一定要(len+1)是为了用额外的一个字节存放空结束符
wyyhzcflying 2004-06-18
  • 打赏
  • 举报
回复
不好意思,小弟实在是帮不上忙?
heuristic 2004-06-15
  • 打赏
  • 举报
回复
mark
alever513 2004-06-15
  • 打赏
  • 举报
回复
所以你要记得delete之后..记得加上 NULL ...
jack_wq 2004-06-15
  • 打赏
  • 举报
回复
delete后还能构引用是因为你的指针很小,如果是一个较大的数组就会出问题!
zqpsswh 2004-06-15
  • 打赏
  • 举报
回复
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
发现指针被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
sboom 2004-06-14
  • 打赏
  • 举报
回复
同意 hoo000(火箭)
没有被再使用时不会出错的。不信弄个指针乱指乱写试试就知道。
xianfeihong 2004-06-14
  • 打赏
  • 举报
回复
同意楼上。
zbstone 2004-06-14
  • 打赏
  • 举报
回复
一般在NEW出对象后,使用完就DELETE,这个时候只是释放了内存
但是没有改变指向的内存地址
安全的做法是再将
pValue=NULL
hoo000 2004-06-14
  • 打赏
  • 举报
回复
delete pValue;时候,内存已经回收,至于后来没有core dump是因为,你个int型指针很小,很有可能这个内存还没有人使用,用非法的地址不一定立刻core dump

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧