内存的回收问题

CppFile 2011-03-02 08:50:35
为了给某个缓冲区分配更大的内存,我用了下面的代码:

unsigned char *buf=new unsigned char[16];

unsigned char *tmpbuf=new unsigned char[32];

delete[] buf;

buf=tmpbuf;

delete[] buf;//回收内存

这样做是否有问题?

回收内存的时候,delete 函数是回收16个字节,还是回收32个字节呢?

以上代码中,tmpbuf指针并未回收,如何回收呢?
...全文
160 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2011-03-02
  • 打赏
  • 举报
回复
delete的时候,系统应该只关心当前指针指向的地址和一个空间结束标记:0xFDFDFDFD;

当你调用 delete buf;的时候,系统就会开始释放buf这个指针指向的空间,那释放多大的呢?直到遇到一个FDFDFDFD为止.如果你不小心在访问的时候,越界,把FDFDFDFD标记破坏了,那不好意思,程序会直接给你个异常,然后终止运行.

delete[] buf; //释放buf指向的空间,

buf=tmpbuf; //buf重新赋值了,它指向了tembuf指向的空间.

delete[] buf;//因为buf已经指tmpbuf,所以释放的就是tembuf指向的空间了.
Joyfulmath 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 cppfile 的回复:]
为了给某个缓冲区分配更大的内存,我用了下面的代码:

unsigned char *buf=new unsigned char[16];

unsigned char *tmpbuf=new unsigned char[32];

delete[] buf;

buf=tmpbuf;

delete[] buf;//回收内存

这样做是否有问题?

回收内存的时候,de……
[/Quote]
没看出为啥这么用,但是代码没啥问题。
quwei197874 2011-03-02
  • 打赏
  • 举报
回复
delete[] buf;

buf=tmpbuf
这是严重的错误!!!
yshuise 2011-03-02
  • 打赏
  • 举报
回复
测试代码可以这样写。但是从异常安全来看,显然还是有问题的。
比如你第二次申请内存失败,那么第一次内存泄露。
当然这是非常严格的写法。可惜很少人注意这个问题。
赵4老师 2011-03-02
  • 打赏
  • 举报
回复
要想永远避免new和delete带来的各种问题,就是不用new和delete。
GARY 2011-03-02
  • 打赏
  • 举报
回复
两次动态申请的内存,都释放了。
GARY 2011-03-02
  • 打赏
  • 举报
回复
我也这么用过,没问题的吧。
unsigned char *buf=new unsigned char[16];

unsigned char *tmpbuf=new unsigned char[32];

delete[] buf; // 释放

buf = tmpbuf; // 之后buf 和 tmpbuf包含相同的地址值

delete[] buf; // 释放
shaotine_wu 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 haogeai123 的回复:]
引用 1 楼 shaotine_wu 的回复:
delete[] buf;

buf=tmpbuf;
buf删除后为一个空指针,把一个指针赋值给一个空指针,肯定有问题的!建议LZ用智能指针!
好好想想你说的话。上论坛说话也要负责任啊
[/Quote]
对不起各位。特别是LZ,由于我的疏忽,给出了错误的答案,请各位原谅!!!!!!!!!!!
TimZhuFaith 2011-03-02
  • 打赏
  • 举报
回复
我试了下 两个都删除 会出错。。。怎么回事[Quote=引用 7 楼 mtj530 的回复:]
最保险的还是把2个都释放吧。这又不麻烦。
[/Quote]
showjim 2011-03-02
  • 打赏
  • 举报
回复
只看这几句,没有任何问题
aixueVC 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]
delete[] buf;

buf=tmpbuf;

delete[] buf;


这样做没问题,前提是tmpbuf的指向最好不要有移动。
第一次delete是释放16字节,第2次delete释放32字节。
[/Quote]
同意,buf与tmpbuf在delete之后最好设为NULL
haogeai123 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shaotine_wu 的回复:]
delete[] buf;

buf=tmpbuf;
buf删除后为一个空指针,把一个指针赋值给一个空指针,肯定有问题的!建议LZ用智能指针!
[/Quote]好好想想你说的话。上论坛说话也要负责任啊
mtj530 2011-03-02
  • 打赏
  • 举报
回复
最保险的还是把2个都释放吧。这又不麻烦。
LinuxBirdMan 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]
delete[] buf;

buf=tmpbuf;

delete[] buf;


这样做没问题,前提是tmpbuf的指向最好不要有移动。
第一次delete是释放16字节,第2次delete释放32字节。
[/Quote]
+1....没有问题的
碎碎念 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 cppfile 的回复:]


delete[] buf; //回收16字节

buf=tmpbuf;

delete[] buf;//回收内存 回收32字节,而且buf,tmpbuf还是值一样


[/Quote]

delete执行完成以后指针的地址值并没有设为NULL,delete只是将分配的内存清理掉...
所以在调用完delete以后最好讲指针设为NULL...
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
delete[] buf;

buf=tmpbuf;

delete[] buf;


这样做没问题,前提是tmpbuf的指向最好不要有移动。
第一次delete是释放16字节,第2次delete释放32字节。
fengzhw 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shaotine_wu 的回复:]

delete[] buf;

buf=tmpbuf;
buf删除后为一个空指针,把一个指针赋值给一个空指针,肯定有问题的!建议LZ用智能指针!
[/Quote]

能不能不闹啊!基本概念是乱开玩笑的吗?!
fengzhw 2011-03-02
  • 打赏
  • 举报
回复
buf, tmpbuf并不是你认为的指针,它只是一个指针变量,指向一个地址,这个地址所在的区域,才是需要回收的。

buf = tmpbuf,就是把这个地址的数值复制到buf中,随后的 delete [] buf,就把申请的32字节干掉了。
shaotine_wu 2011-03-02
  • 打赏
  • 举报
回复
delete[] buf;

buf=tmpbuf;
buf删除后为一个空指针,把一个指针赋值给一个空指针,肯定有问题的!建议LZ用智能指针!
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
如果你想动态分配内存又闲释放太麻烦那就是用vector
加载更多回复(1)

64,654

社区成员

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

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