这样写,是否存在内存泄露

云斜月 2014-06-02 10:44:13

char *buf = new char[20];
char* newbuf = new char[len];
memset(newbuf,buf,strlen(buf)+1);
delete[] buf;
buf = newbuf; //这样写,是否存在内存泄露
...全文
360 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
menzi11 2014-06-06
  • 打赏
  • 举报
回复
引用 22 楼 windowpos 的回复:
[quote=引用 21 楼 menzi11 的回复:] [quote=引用 19 楼 windowpos 的回复:] [quote=引用 18 楼 menzi11 的回复:] [quote=引用 13 楼 windowpos 的回复:] delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
你懂什么叫指针吗........[/quote] 你懂什么叫编程吗?[/quote] 看到批评生气也正常, delete[] buf中delete,delete的是buf指向的内存不是buf本身.buf没有被删掉, 可以放心指向另一个地址.[/quote] 你写代码还停留在大学,只要编译通过能运行就一切ok了?[/quote] 呵呵
maliang351 2014-06-05
  • 打赏
  • 举报
回复
引用 2 楼 li744831579 的回复:
[quote=引用 楼主 li744831579 的回复:]

char *buf = new char[20];
			char* newbuf = new char[len];
			memset(newbuf,buf,strlen(buf)+1);
			delete[] buf;
			buf = newbuf;   //这样写,是否存在内存泄露
这只是部分代码, 我是问 ,我delete buf后,buf时候还可以用,是否可以重新赋值。[/quote] 第一:memset有问题吧,memcpy还差不多哦; 第二:buf可以赋值。buf是你定义的一个char*,它的类型是个指针,它指向什么是由程序员决定的。之前指向new char,后来指向newbuf,当然可以。 最后,只要注意释放newbuf就行了。
亞鬥 2014-06-05
  • 打赏
  • 举报
回复
引用 18 楼 menzi11 的回复:
[quote=引用 13 楼 windowpos 的回复:] delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
你懂什么叫指针吗........[/quote] 你懂什么叫编程吗?
lx624909677 2014-06-05
  • 打赏
  • 举报
回复
只要不new,就没有空间,你那样写只是指向了别人的空间,自己本身没空间,但是下面那个不释放的话,会有问题
亞鬥 2014-06-05
  • 打赏
  • 举报
回复
引用 21 楼 menzi11 的回复:
[quote=引用 19 楼 windowpos 的回复:] [quote=引用 18 楼 menzi11 的回复:] [quote=引用 13 楼 windowpos 的回复:] delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
你懂什么叫指针吗........[/quote] 你懂什么叫编程吗?[/quote] 看到批评生气也正常, delete[] buf中delete,delete的是buf指向的内存不是buf本身.buf没有被删掉, 可以放心指向另一个地址.[/quote] 你写代码还停留在大学,只要编译通过能运行就一切ok了?
menzi11 2014-06-05
  • 打赏
  • 举报
回复
引用 19 楼 windowpos 的回复:
[quote=引用 18 楼 menzi11 的回复:] [quote=引用 13 楼 windowpos 的回复:] delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
你懂什么叫指针吗........[/quote] 你懂什么叫编程吗?[/quote] 看到批评生气也正常, delete[] buf中delete,delete的是buf指向的内存不是buf本身.buf没有被删掉, 可以放心指向另一个地址.
menzi11 2014-06-04
  • 打赏
  • 举报
回复
引用 13 楼 windowpos 的回复:
delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
你懂什么叫指针吗........
shiter 2014-06-04
  • 打赏
  • 举报
回复
路过学习一下
康斯坦汀 2014-06-04
  • 打赏
  • 举报
回复
这么写没问题,但是需要再delete一次,buf仅仅是一个指针,new是为这个指针分配一块内存区域, 然后你delete就是释放这个内存区域,然后buf指针被另一块内存区域的指针赋值,(它又申请了一块内存 ,这个没有释放)这么写没什么问题,一个好习惯是,指针使用前赋值为NULL,然后delete后在设置为NULL, 使用时判断不为NULL。
nickwu1220 2014-06-04
  • 打赏
  • 举报
回复
delete[] buf 后,buf指针当然还能指向别人的内存,可以使用 要么改用智能指针,要么就catch 下异常。
云斜月 2014-06-04
  • 打赏
  • 举报
回复
引用 13 楼 windowpos 的回复:
delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
delete[] buf 是删除buf占用的空间。 而下边的newbuf是重新分配的空间, 两个空间没有联系的。
亞鬥 2014-06-04
  • 打赏
  • 举报
回复
delete[] buf; buf = newbuf; 已经删了buf,你还让他等于newbuf.你怎么敢这么写
云斜月 2014-06-04
  • 打赏
  • 举报
回复
引用 11 楼 bie_niu1992 的回复:
楼主memset(newbuf,buf,strlen(buf)+1); //这句有错误吧,memset()参数2你这样给明显类型不对吧 还要你最后buf = newbuf; 这样复制,最后你释放怎么释放,buf,newbuf指向同一块内存,你释放了newbuf,但是buf还指着那块区域,但是已经没了,肯定会出异常,就像深拷贝问题一样 本人菜鸟一个,只是个人理解
是memcpy,写的时候没注意,
bobo_包子 2014-06-03
  • 打赏
  • 举报
回复
大湿们推荐用智能指针。
别逗爷很凶 2014-06-03
  • 打赏
  • 举报
回复
楼主memset(newbuf,buf,strlen(buf)+1); //这句有错误吧,memset()参数2你这样给明显类型不对吧 还要你最后buf = newbuf; 这样复制,最后你释放怎么释放,buf,newbuf指向同一块内存,你释放了newbuf,但是buf还指着那块区域,但是已经没了,肯定会出异常,就像深拷贝问题一样 本人菜鸟一个,只是个人理解
Bera枫 2014-06-03
  • 打赏
  • 举报
回复
引用 7 楼 3m2u 的回复:
如果没有特殊逻辑,这么写的coder应该罚款开除啊
+1
menzi11 2014-06-03
  • 打赏
  • 举报
回复
不会泄露且没有任何问题.当然最后得把buf再delete一次.
starytx 2014-06-03
  • 打赏
  • 举报
回复
buf和newbuf都只是一个字符指针而已,可以用来保存new返回的空间首地址
3m2u 2014-06-03
  • 打赏
  • 举报
回复
如果没有特殊逻辑,这么写的coder应该罚款开除啊
ggglivw 2014-06-03
  • 打赏
  • 举报
回复
new delete, new[] delete[] 一定要配对
加载更多回复(4)

64,654

社区成员

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

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