免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3580 | 回复: 17
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-14 11:13 |只看该作者 |倒序浏览
char *p=new char[1024]

申请1M的内存缓冲区

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

例如:

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

有没有必要显式调用i1,i2的析构函数释放空间呢?或者我干脆在程序末尾直接 delete [] p  就都释放掉了吧

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2007-02-14 11:16 |只看该作者
new和delete干的事不止是分配和释放空间,最重要的是调用构造函数和析构函数!

论坛徽章:
0
3 [报告]
发表于 2007-02-14 11:24 |只看该作者
原帖由 cobras 于 2007-2-14 11:16 发表
new和delete干的事不止是分配和释放空间,最重要的是调用构造函数和析构函数!


对呀,我完全可以在new的时候用不同参数形式完成对于不同构造函数的调用

问题是对于这种类型的数据有没有必要去显示调用析构函数?因为delete对于布局new生成的变量是不起作用的

在程序末尾直接delete []p  就一下子释放掉所有空间了

论坛徽章:
0
4 [报告]
发表于 2007-02-14 11:26 |只看该作者
我觉得都要delete
先delete class 用于析构,再delete空间

sorry是我记错了。呵呵。p->~class();然后再delete p
试试

[ 本帖最后由 haohao06 于 2007-2-14 11:48 编辑 ]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2007-02-14 11:28 |只看该作者
即使重载的delete函数什么都不做,编译器也会在使用delete的地方调用该对像的析构函数,你说有没有用呢?

论坛徽章:
0
6 [报告]
发表于 2007-02-14 11:31 |只看该作者
原帖由 cobras 于 2007-2-14 11:28 发表
即使重载的delete函数什么都不做,编译器也会在使用delete的地方调用该对像的析构函数,你说有没有用呢?



哥们,对于普通new操作符delete管用,但是对于布局new操作符delete 一点用处没有!
要想析构必须显式调用,我上来就是想请教一下熟练运用布局new的朋友们是如何处理这个问题的

论坛徽章:
0
7 [报告]
发表于 2007-02-14 11:38 |只看该作者
使用placement操作符的时候,使用到内存的类只要在结束生命的时候调用自己的析构就好了,预分配的内存才需要调用delete,对于你的代码就应该是这样的:

i1->~class();//
delete [] p;

论坛徽章:
0
8 [报告]
发表于 2007-02-14 11:49 |只看该作者
原帖由 converse 于 2007-2-14 11:38 发表
使用placement操作符的时候,使用到内存的类只要在结束生命的时候调用自己的析构就好了,预分配的内存才需要调用delete,对于你的代码就应该是这样的:

i1->~class();//
delete [] p;


多谢版主解答

其实我想请教的就在于此,如果我不调用自身析构而是直接 delete [] p 的话有什么坏处吗?
因为在程序结束的时候所有i1 i2 这些自动变量本身也已经死亡,其所指向的空间也用delete [] p 释放了
如此看来调用自身这一步是否可以省略??

论坛徽章:
0
9 [报告]
发表于 2007-02-14 11:52 |只看该作者
原帖由 oract666 于 2007-2-14 11:49 发表


多谢版主解答

其实我想请教的就在于此,如果我不调用自身析构而是直接 delete [] p 的话有什么坏处吗?
因为在程序结束的时候所有i1 i2 这些自动变量本身也已经死亡,其所指向的空间也用delete [] p 释放 ...


之所以提供析构函数是因为一个对象在game over之前有一些后事要交待,如果没有而只是简单的回收空间的话,我认为是没有必要调用析构的了...

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


之所以提供析构函数是因为一个对象在game over之前有一些后事要交待,如果没有而只是简单的回收空间的话,我认为是没有必要调用析构的了...


纠正一下我说的,如果你的类里面存放有指针但是指针指向的空间是动态分配的,那还是需要调用一下析构去释放的...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP