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

关于new的疑问?

楼主zhangzhm()2006-06-03 21:24:18 在 C/C++ / C++ 语言 提问

#include   <malloc.h>  
  #include   <memory.h>  
   
  class   Blanks  
  {  
  public:  
          Blanks(){}  
          void   *operator   new(   size_t   stAllocateBlock,   char   chInit   );  
  };  
  void   *Blanks::operator   new(   size_t   stAllocateBlock,   char   chInit   )  
  {  
          void   *pvTemp   =   malloc(   stAllocateBlock   );  
          if(   pvTemp   !=   0   )  
                  memset(   pvTemp,   chInit,   stAllocateBlock   );  
          return   pvTemp;  
  }  
   
  int   main()  
  {  
          Blanks   *a5   =   new(   0xa5   )   Blanks;  
   
          return   a5   !=   0;  
  }  
   
  主函数的new是类中new操作符重载。  
  但是new后面只有一个参数0xa5,  
  而类中函数的声明是void   *operator   new(   size_t   stAllocateBlock,   char   chInit   );两个参数。  
  怎么会调用这个类内的呢?  
  问题点数:20、回复次数:7Top

1 楼triace_zhang(『雪梨码头』)回复于 2006-06-03 21:36:17 得分 0

Blanks   *a5   =   new(   0xa5   )   Blanks;  
   
  定位new,在指定的地址(   0xa5   )直接建立一个对象.Top

2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 21:48:02 得分 0

学习了...  
  实验一下·Top

3 楼sharpdew(风刃)回复于 2006-06-03 22:08:13 得分 20

呵呵,你难道没有看到是两个参数吗?  
  Blanks   *a5   =   new(   0xa5   )   Blanks;  
  一个是   0xa5被当作char了,Blanks就是对应内存大小的那个参数呀!  
  这是最基本的知识了,要不知道,你怎么知道重载new的呢Top

4 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 22:11:43 得分 0

//   Blanks   *a5   =   new(   0xa5   )   Blanks;  
  -----------  
  长见识了!·!Top

5 楼sharpdew(风刃)回复于 2006-06-03 22:37:35 得分 0

再顺便说一下,类里面的new操作会覆盖全局的new,所以会出现这种现象:  
  Blanks   *a5   =   new(   0xa5   )   Blanks;     //   ok,   call   new(size_t,char)   in   the   class  
   
  a5   =   new   Blanks;   //   error,   can   not   find   a   new()Top

6 楼zhangzhm()回复于 2006-06-03 23:12:48 得分 0

看这个文章就彻底明白了。  
  http://www.cppblog.com/alantop/archive/2006/06/03/8131.htmlTop

7 楼luvybird()回复于 2006-06-04 00:23:12 得分 0

当void   *Blanks::operator   new(   size_t   stAllocateBlock,   char   chInit   )  
  改写为void   *Blanks::operator   new(   size_t   stAllocateBlock,   void   *   location   )  
  才是在0xa5的地址上建立对象  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:zhangzhm
  • sharpdew

相关链接

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

广告也精彩

反馈

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