与大家讨论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 是如何处理的..
请高手多发表一个自已的见解啊....
...全文
111 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 的结果是否一样啊.

指高手指点
c++城市公交查询系统 1.设有一文件对象in_file,若在while循环用in_file>> 每次从文件得到一个字符串直到文件结束, 如果用in_file直接来判断文件是否结束, 则文件末的那个字符串会得到两次。 而用文件in_file.eof()来判断则会得到正确的结果。 2.用delete []释放字符串空间时,老是有问题, 其的原因之一是你原来申请的空间不够大, 后来往这个空间放了过多的内容以至越界, 这时候会发生运行时的错误。 3.把一个对象作为参数传给另一个对象的成员函数时, 程序不能正常结束,即系统删除对象时有问题; 而使用指针或者引用传递参数时不仅不会出现问题, 而且可以人为的删除对象。 我个人认为这很有可能是值传递的原因, 当把一个对象作为实参传给一个函数时,函数形参拷贝了实参的值, 这时,如果对象有指针成员,那么形参的指针成员的值和 实参的指针成员的值将完全一样, 即它们指向的是同一块内存,所以当函数调用结束的时候, 函数的形参将会被系统撤消, 这时,形参调用析构函数,释放用new动态申请的内存。在函数的外面, 作为实参的对象的指针成员其实已经被撤消了,所以当程序结束, 系统撤消这个对象时,这个对象又要调用析构函数来释放指针成员, 但这时指针其实已经指向了非法的空间,导致出错。 bus 文件夹的内容记录的是每条线路的信息,对应于bus 类。 每个文件以线路名称(即车名,忽略前面的k)命名。 每个文件的内容组织如下:(共分为6行,以回车键作为行结束标志) 第一行为“线路名称:#### ”,其####用具体的线路名称代替; 第二行为“上行站点:####”。 第三行为“下行站点:####”。 第四行为“首班车时间:####”。 第五行为“末班车时间:####”。 第六行为“票价:####”。 注:若不分“上行站点”和“下行站点”, 则第二行为“站点名称:####”, 第三行为空行;

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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