CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

c++ primer关于定位new表达式

楼主wingfiring(非典型秃子)2002-08-15 17:38:07 在 C/C++ / C语言 提问

p347   8.4.5节(电力出版社):  
  定位new表达式的问题举例:  
  class   A  
  {  
  public:  
  A(){cout   <<   "a   init"   <<endl;}  
  ~A(){cout   <<   "a   destory"   <<   endl;}  
   
  };  
   
  void   fun()  
  {  
  char   *Buf   =   new   char[200];  
  A   *pa   =   new(Buf)   A;  
  delete   *Buf;  
  }  
  提问:  
  书中称对不存在与定位表达式相匹配的delete表达式,  
  那么也就不需要delete   pa所指向的对象了。但是问题来了:  
  当我new一个A对象的时候,构造函数是调用了的,但是,无论  
  是我退出函数还是delete   *buf,都不会调用析构函数。  
  在这个例子里面还没有问题,可是,如果我在在构造函数中又  
  创建了新的对象,那就麻烦了:不可避免的会出现内存泄漏。  
  那么是不是我可以使用delete   pa了呢?(我的经验是一般这样肯定  
  会出问题的)如果不能,有没有什么好的解决方法?还是只能采用  
  在A中增加一个Release方法这样丑陋的方法呢? 问题点数:100、回复次数:9Top

1 楼anrxhzh(百宝箱)回复于 2002-08-15 17:55:07 得分 15

void   fun()  
  {  
  char   *Buf   =   new   char[200];  
  A   *pa   =   new(Buf)   A;  
                    pa->~A();  
  delete   *Buf;  
  }  
  Top

2 楼cwanter(亚玛逊河上的渔夫)回复于 2002-08-15 17:55:58 得分 15

首先提出一点:delete   *Buf是不是应为delete   []   Buf?  
  "退出函数还是delete   []buf,都不会调用析构函数",退出函数不会调用析构函数,调用delete   []buf会调用析构函数。Top

3 楼anrxhzh(百宝箱)回复于 2002-08-15 17:58:07 得分 0

void   fun()  
  {  
  char   *Buf   =   new   char[200];  
  A   *pa   =   new(Buf)   A;  
                    pa->~A();  
  delete[]   Buf;  
  }  
  Top

4 楼anrxhzh(百宝箱)回复于 2002-08-15 17:59:15 得分 0

http://www.research.att.com/~bs/bs_faq2.html#placement-deleteTop

5 楼Tommy()回复于 2002-08-15 21:18:41 得分 50

同意楼上,可以直接调用析构函数。在C++   Primer后面的章节中也有提到这个问题,而且在15.8.2,P631对placement   new和delete进行了更多的讨论,提出还是可以定义一个与placement   new对应的delete,在处理异常时使用。  
   
  我觉得C++   Primer最不好的一点就是相关的内容分布在不同的地方,经常提到一个概念,然后说在后面会提到。faint~~~     还是The   C++   Program   Language好,在placement   new时就说清楚了析构的方法。Top

6 楼wingfiring(非典型秃子)回复于 2002-08-16 10:33:49 得分 0

前面的是我写错了,应该是delete   []buf.  
  不过,显式的调用析构函数让我觉得代码很难看。  
  怎样做才是最优雅的呢?  
  ================================================================  
   
   
  Top

7 楼Tommy()回复于 2002-08-16 14:27:12 得分 0

如果类中所有对象都是用placement   new的话,重载类的operator   new和delete,在其中做placement   new和释放工作。使用类的人将不必处理这些细节。  
  Top

8 楼blwyw(半桶水)回复于 2002-08-16 17:28:10 得分 10

 
  placement   operator   delete用法:  
                    A::operator   delete(   Buf,   pa   );Top

相关问题

  • 看C++primer的一点疑惑:关于定位new表达式的疑问(书P347)
  • “定位new表达式”的?
  • 表达式求值 C#
  • javascript正则表达式转换成c#正则表达式
  • 我对C++中表达式的看法
  • C#正则表达式问题
  • 求一正则表达式(c#)
  • 关于表达式c=(a%b,a/b),
  • 关于定位new表达式的问题
  • 关于new的定位表达式的疑问.

关键词

  • c++
  • 函数
  • c++primer
  • placement
  • 调用析构函数
  • buf
  • delete
  • 提到
  • 类
  • pa

得分解答快速导航

  • 帖主:wingfiring
  • anrxhzh
  • cwanter
  • Tommy
  • blwyw

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo