免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: oract666
打印 上一主题 下一主题

布局new操作符申请的空间有必要释放吗? [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
11 [报告]
发表于 2007-02-14 12:04 |只看该作者
楼主,重载delete如下就可以了
void operator delete(void *p){
}
以后可直接使用,而且会调用destructor哦

论坛徽章:
0
12 [报告]
发表于 2007-02-14 12:05 |只看该作者
原帖由 converse 于 2007-2-14 11:56 发表


纠正一下我说的,如果你的类里面存放有指针但是指针指向的空间是动态分配的,那还是需要调用一下析构去释放的...



例如 class 中包含 char *pp
在程序中又调用了  pp=new char[20] 之类的代码

这样的话应该在程序中显式调用 delete [] pp  去释放这块空间吧
如果靠类本身的析构去释放的话 析构函数里面应该包含类似代码 delete [] pp

其实我对于析构函数的认识大都是释放空间之类的,还真是不太了解都有哪些后事是它处理的

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
13 [报告]
发表于 2007-02-14 12:12 |只看该作者
当然内存池也应该使用非new方式获得,如全局数组或malloc

论坛徽章:
0
14 [报告]
发表于 2007-02-14 12:14 |只看该作者
原帖由 cobras 于 2007-2-14 12:12 发表
当然内存池也应该使用非new方式获得,如全局数组或malloc


malloc 和 new 分别对应c 和c++ 吧,都是从堆里面获取地址段
二者本质应该一样吧

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
15 [报告]
发表于 2007-02-14 12:16 |只看该作者
因为重载了delete,所以内存池会无法释放,所以使用其它方式.

论坛徽章:
0
16 [报告]
发表于 2007-02-14 13:12 |只看该作者
原帖由 oract666 于 2007-2-13 19:13 发表
char *p=new char[1024]

申请1M的内存缓冲区

然后使用布局new操作符利用缓冲区内存

例如:

     class *i1=new (p) class;
        class *i2=new (p+sizeof(class)) class;

有没有必要显式调用i ...


一般来说要调用析构函数,如果很析构函数其实什么都没做,貌似也可以不调用?

论坛徽章:
0
17 [报告]
发表于 2007-02-14 14:02 |只看该作者
原帖由 emacsnw 于 2007-2-14 13:12 发表


一般来说要调用析构函数,如果很析构函数其实什么都没做,貌似也可以不调用?


其实我的疑问也在这里

因为对于没有申请堆空间的类来说析构函数其实是空的,它究竟做了哪些事情根本不知道。当然绝大多数强调析构函数的应用是因为类申请了堆空间必须在析构函数里面进行delete。析构函数留给我的印象其实就是delete而已,我想弄清楚析构函数的真实应用情况问题就能迎刃而解了

论坛徽章:
0
18 [报告]
发表于 2007-02-14 17:33 |只看该作者
原帖由 oract666 于 2007-2-13 22:02 发表


其实我的疑问也在这里

因为对于没有申请堆空间的类来说析构函数其实是空的,它究竟做了哪些事情根本不知道。当然绝大多数强调析构函数的应用是因为类申请了堆空间必须在析构函数里面进行delete。析构函数留 ...


析构函数除了用于释放可能分配的堆空间内存,还负责析构对象的各个成员(尽管析构函数里不用写明)。比如对象有一个ostream的成员,fully buffer或者line buffer。当对象被析构时候我们知道这个stream在自己被析构的时候会自动flush掉缓存,而不用在析构函数里显示的调用flush manipulator。
如果你是placement new的对象,假如不调用析构函数直接在这块内存上分配新的对象,可能这些东西就不会被flush了?这只是个例子,也没有证实,呵呵。

[ 本帖最后由 emacsnw 于 2007-2-14 01:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP