请教个动态指针的操作问题

trusttzg 2013-05-14 04:53:06
刚刚开始学习C++,现在遇到了一个对动态数组的操作问题,例如:

char *p = new char[100];

p = p + 1; //指向下一个元素

delete [] p; //如果不delete,就不会报错

这时,只要delete编译器就会报错,查了一下貌似是不能对动态申请的指针进行重新赋值的问题。于是,重新定义:

char *p = new char[100];
char *p2;
p2 = p1
p2 = p2 + 1;

delete [] p;
这样就能操作那块内存了,我的困惑是:

1、定义一个指定,如例子里的*p2,是不是一定要delete掉它?
2、如何规范操作申请的动态数组?

谢谢!
...全文
123 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
derekrose 2013-05-14
  • 打赏
  • 举报
回复
第一个为什么会报错 原理你没搞懂
whut_lcy 2013-05-14
  • 打赏
  • 举报
回复
C/C++的动态内存之所以可以被准确的free/delete掉,是因为在分配内存时会额外分配一块区域用于保存分配的内存大小信息,这块区域往往在malloc/new返回的地址之前。所以,内存分配10字节,实际上在堆上分配掉的会大于10字节。更细节的,可以查看free函数的源代码(记得free操作只是修改了一个指示标记) 你把p重新赋值后,传递给delete进行释放操作,记录内存信息的区域丢失,操作系统无法进行正确的释放操作,导致出错。
就是那个党伟 2013-05-14
  • 打赏
  • 举报
回复
引用 7 楼 starytx 的回复:
[quote=引用 6 楼 trusttzg 的回复:] [quote=引用 3 楼 yudahai109 的回复:] 很简单,就像孙鑫老师讲的,你每次编程的时候,头脑中都要用一个内存模型的概念。 你上面的代码中,p=p+1;这时候再delete []p;就删除从p开始的100个sizeof(char)大小的内存,但是之前你的p改动过,所以导致最后一个char的内存删除失败,因为那一小段内存不是你的。。
谢谢指教,但是我理解的p=p+1是指向动态数组的下一个元素吧,为什么会对这块内存造成影响呢?不明白为什么内存会变大了[/quote]p只是一个指针,其中保存着一个内存地址,开始它指向new操作符返回的动态开辟的内存首地址,后来你让他+1也就指向了这个地址的下一个元素的地址(因为你的指针是char类型,所以每个元素1个字节),delete只能用来释放new返回的地址,而此时你的p已经改变,所以出错了[/quote] ++
starytx 2013-05-14
  • 打赏
  • 举报
回复
引用 6 楼 trusttzg 的回复:
[quote=引用 3 楼 yudahai109 的回复:] 很简单,就像孙鑫老师讲的,你每次编程的时候,头脑中都要用一个内存模型的概念。 你上面的代码中,p=p+1;这时候再delete []p;就删除从p开始的100个sizeof(char)大小的内存,但是之前你的p改动过,所以导致最后一个char的内存删除失败,因为那一小段内存不是你的。。
谢谢指教,但是我理解的p=p+1是指向动态数组的下一个元素吧,为什么会对这块内存造成影响呢?不明白为什么内存会变大了[/quote]p只是一个指针,其中保存着一个内存地址,开始它指向new操作符返回的动态开辟的内存首地址,后来你让他+1也就指向了这个地址的下一个元素的地址(因为你的指针是char类型,所以每个元素1个字节),delete只能用来释放new返回的地址,而此时你的p已经改变,所以出错了
trusttzg 2013-05-14
  • 打赏
  • 举报
回复
引用 3 楼 yudahai109 的回复:
很简单,就像孙鑫老师讲的,你每次编程的时候,头脑中都要用一个内存模型的概念。 你上面的代码中,p=p+1;这时候再delete []p;就删除从p开始的100个sizeof(char)大小的内存,但是之前你的p改动过,所以导致最后一个char的内存删除失败,因为那一小段内存不是你的。。
谢谢指教,但是我理解的p=p+1是指向动态数组的下一个元素吧,为什么会对这块内存造成影响呢?不明白为什么内存会变大了
trusttzg 2013-05-14
  • 打赏
  • 举报
回复
但是 p2 的那块内存要怎么处理的呢?这样使用的话会不会对程序造成什么风险? 我的问题是在分割读写二进制文件的时候遇到的,例如: outfile.write(buffer, 256); //把buffer里的0-255的256个字节写入outfile中 下面我需要把buffer里的第256-512的256的字节写到另外一个文件中(即buffer = buffer + 256),这时就遇到了如何操作buffer的问题,而buffer是之前new的一个动态数组,就有了如何操作动态数组的问题。
有新工作否 2013-05-14
  • 打赏
  • 举报
回复
没有什么规范不规范的,c和c++就是使用非常灵活,效率高,才被很多人喜欢。要是你要规范的话,可以学java或者c#。
有新工作否 2013-05-14
  • 打赏
  • 举报
回复
很简单,就像孙鑫老师讲的,你每次编程的时候,头脑中都要用一个内存模型的概念。 你上面的代码中,p=p+1;这时候再delete []p;就删除从p开始的100个sizeof(char)大小的内存,但是之前你的p改动过,所以导致最后一个char的内存删除失败,因为那一小段内存不是你的。。
Shana2013 2013-05-14
  • 打赏
  • 举报
回复
delete目的是用于释放动态申请的内存,如果有多个指针指向这块内存,则只需要对一个指针delete就可以释放这块内存了,不能再delete其他指针对这块内存进行二次释放。
xucuiping_ 2013-05-14
  • 打赏
  • 举报
回复
只要有一处 释放空间就可以了 p2不需要再delete

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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