与大家讨论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 是如何处理的..
请高手多发表一个自已的见解啊....
...全文
147 10 打赏 收藏 转发到动态 举报
写回复
用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 的结果是否一样啊.

指高手指点
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

15,465

社区成员

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

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