社区
C语言
帖子详情
关于内存的动态分配和回收?
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是同样的结果。
...全文
294
16
打赏
收藏
关于内存的动态分配和回收?
我写了一段如下代码: int *pValue=NULL; pValue=new int; *pValue=120; delete pValue; *pValue=130; int i=*pValue; 此时i的值为130,谁能详细讲解一下整个过程中内存的动态分配和回收,及delete后为什么还能再引用?把 new和delete换成malloc和free是同样的结果。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
linux2.6.1内核源码注释
Linux使用了分页系统来管理物理和虚拟
内存
,包括页表维护、
内存
分配(kmalloc, vmalloc等)、页面
回收
以及
内存
压力管理。此外,还有伙伴系统(buddy system)用于动态
内存
分配,以及slab分配器优化常见对象的分配...
内存
管理: 动态
内存
分配与垃圾
回收
在现代计算机系统中,
内存
管理的一个关键组件是动态
内存
分配与垃圾
回收
。这两个技术为程序提供了灵活的
内存
分配机制,使得程序可以在运行过程中动态地分配和释放
内存
。 动态
内存
分配是指在程序运行过程中,根据需要...
模拟实现
内存
动态分区分配与
回收
一、目的 四个动态分区分配算法:最佳适应算法,循环首次适应算法,...首先创建memory类,类中包含四个
内存
分配
回收
算法: 首次适应算法private void FristFit(int size) 从链首开始顺序查找 循环首次适应算法privat
内存
动态分区分配与
回收
(1)要求 <1>.四个动态分区分配算法:最佳适应算法,最坏适应算法,首次适应算法,循环首次适应算法. <2>...有输出界面,能够查看
内存
分配与
回收
的结果. (2)初始化 我是创了一个进...
内存
的分配与
回收
实验
1.要求用你熟悉的程序设计语言编写和调试一个
内存
分配和
回收
模拟程序;要求在主函数中测试。 2.实验报告中必须包括:设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果...
C语言
70,020
社区成员
243,265
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章