社区
C++ 语言
帖子详情
内存的回收问题
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
打赏
收藏
内存的回收问题
为了给某个缓冲区分配更大的内存,我用了下面的代码: unsigned char *buf=new unsigned char[16]; unsigned char *tmpbuf=new unsigned char[32]; delete[] buf; buf=tmpbuf; delete[] buf;//回收内存 这样做是否有问题? 回收内存的时候,delete 函数是回收16个字节,还是回收32个字节呢? 以上代码中,tmpbuf指针并未回收,如何回收呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Android应用程序进程管理
进程
回收
发生在
内存
紧张时,由Low Memory Killer执行。此外,组件管理服务ActivityManagerService和窗口管理服务WindowManagerService也会在适当的时候主动进行进程
回收
。每一个应用程序进程根据运行情况被赋予...
关于c++ stl
内存
回收
问题
最近用到c++ stl 的map和vector来处理... 这个好像没什么
问题
,用swap系统可以
回收
内存
,作用域结束(比如声明一个vector为局部变量的函数退出后)也会自动系统也会自动
回收
。 关于map: 在linux (CentOS rel
Java
内存
回收
机制
Java的一个重要优点就是通过垃圾收集器GC (Garbage Collection)自动管理
内存
的
回收
,程序员不需要通过调用函数来释放
内存
。因此,很多程序员认为Java 不存在
内存
泄漏
问题
,或者认为即使有
内存
泄漏也不是程序的责任...
【Linux内核】
内存
管理——
内存
回收
机制
当物理
内存
不足时,内核会进行物理
内存
回收
,
内存
回收
的方式主要有: 1. 后台
内存
回收
(kswapd) 2. 直接
内存
回收
(direct reclaim) 3. OOM机制(Out of Memory) 三种
内存
回收
方式按
内存
的紧缺程度递进。
linux
内存
-
内存
回收
1、直接
内存
回收
有新的大块
内存
分配请求,但是剩余
内存
不足。这个时候系统就需要
回收
一部分
内存
,进而尽可能地满足新
内存
请求。 2、定期扫描
回收
(kswapd) 操作系统内核线程kswapd定期进行
回收
内存
,并通过...
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章