与大家讨论c++语言中 指针的申请与撤消问题....欢迎发言

jin_hua 2005-02-28 10:36:49
c语言中.
如何我申请了一段内存..
如:
char *cp ;
cp = new char[20] ;
然后我
将指针后移几个单位.
如:
cp = cp+2 ;

此时, 如果我再用delete cp ;

不知前面的两个单位的内存撤消没有 ,我测试是运行delete cp, 系统出错..如果在delete cp 前
运行cp = cp -2 ;则可以了.

不知delete 是如何处理的..
请高手多发表一个自已的见解啊....
...全文
83 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sanhill 2005-03-02
这个问题这样解决!
char *cp ;
cp = new char[20] ;
需要将指针后移几个单位.
可以这样的 char* p = cp;
然后 p = p+2 ;
取值的话,和使用cp是一样的
最后释放的时候就释放cp就行了。

始终记住一点,释放的地址一定要和开辟的内存地址一致。如果需要移动指针取值,请用中间临时变量。这个规则在哪里都使用。

另外,delete与delete[]对于char,BYTE类型来说,都是一样的,没有区别。
回复
code8238 2005-03-02
楼上说的有理,但有个疑问,难道每次释放一块内存的时候都要把指针移动回起始位置吗?如果程序执行过程中不知道指针移动到哪里的话,应该怎么释放?
回复
jin_hua 2005-03-02
多谢楼上指点.....
受益多多..
结贴!
回复
edrftgyh 2005-03-01
对于内建型别来说,delete [] 和delete实际上是没有什么区别的,所不同的是delete只会调用一次析构函数,而delete []则会对每一个对象调用析构函数。
楼上说的都有道理,但有一点都没有说,当你分配一块内存的时候,实际上系统在这块内存的前面多分配了一个记录内存信息结构大小的空间,用来记录这块内存的大小或是否已被释放等相关信息,当你delete这块内存时,系统实际上会将指针向前便宜以获得这块内存的相关信息,这样就可以正确的释放内存,你将指针向前便宜的话会致使系统获得不正确的内存信息,从而会导致内存释放的错误。
回复
cnwolf 2005-03-01
楼上的观点我不赞同,堆我不清楚,不好说

栈在使用的时候是从高址到地址的,可是变量的符号是指向地址的吧

就如同我们在函数中声明了int a,b;char c[10];

假设a表示1000h,那么b应该是1000h-4,c应该是1000h-4-A;

c+1,c+2都应该在c这个数组的范围之内,何来越界之说

至于堆,在分配的时候好像除了给用户的数据空间,在前后还有一些系统维护的数据结构
,如果改变指针去删除的话,应该会有问题吧

可以找一些堆溢出的文章看看
回复
yafizyh 2005-03-01
堆栈的申请是向下分配的。 cp = cp -2 ; cp仍指向分配空间,但cp = cp +2 ;使cp指向了分配空间以外的地址, delete cp ; 会造成系统错误。看看汇编吧,对计算机结构会有比较清楚地了解。
再次强调:堆栈的申请是向下分配的!
回复
code8238 2005-02-28
释放一段内存应该用
delete[] cp;
回复
flyelf 2005-02-28
申请了一块内存之后,不能只释放部分内存
回复
abc2003World 2005-02-28
delete p 与delete []p不同,在MSDN的C++ Language Reference The operator delete Function一文中有提到,使用前者释放数组可能造成泄漏(MSDN:To perform this detection, the global new and delete operators are redefined to count allocation and deallocation of memory)。

同时也解决了第一个问题。
回复
jin_hua 2005-02-28
回楼上,
申请的内存移动几个单位扣,为何delete cp 会错,难道delete 前一将指
针移到起始点吗?

另:
char *p ;
p = new char[7] ;
则 delete p 与delete []p 的结果是否一样啊.

指高手指点
回复
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2005-02-28 10:36
社区公告
暂无公告