CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

在栈上new的话, 怎么会有这样的问题? 请看代码。

楼主jazzny(寒风)2003-11-03 02:26:02 在 C/C++ / C语言 提问

#include   <iostream>  
   
  using   namespace   std;  
   
  int   main(){  
  char   place[8];  
  int   *   pint;  
   
  pint   =   new   (place)   int[2];  
   
  for(   int   i   =   0;   i   <   2;   i++){  
  cout<<(*pint)<<endl;  
  }  
   
   
  delete   []   pint;  
   
   
  return   0;  
   
  }  
   
   
  use   operator   new   on   heap,   then   delete,     it   is   OK.   what   is   the   difference   between   the   two   method?   I   guess   ,   there   is   a   mark   at   the   end   of   the   memory   allocated   by   new   on   heap.  
  waiting   for   solution.....  
  问题点数:0、回复次数:11Top

1 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 07:22:19 得分 0

想骂娘。。。居然在栈上用   placement   new,还   delete   ,我晕Top

2 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 07:58:23 得分 0

突然想明白了:new   分配的内存由   delete   来清理。看看   VC   的   placement   new   的实现:  
  inline   void   *__cdecl   operator   new[](size_t,   void   *_Where)   _THROW0()  
  { //   construct   array   with   placement   at   _Where  
  return   (_Where);  
  }  
  只是直接提交传入的指针,所以根本没有分配内存,用   delete[]   清理当然不对了,哈哈  
   
  inline   void   __cdecl   operator   delete[](void   *,   void   *)   _THROW0()  
  { //   delete   if   placement   array   new   fails  
  }  
  这个是跟你的   placement   array   new   相对应的   placement   delete,但是不知道怎么使用。呵呵,谁知道的提醒一下。  
   
  我怀疑的是:因为   placement   new   没有分配内存,所以根本不需要   placement   deleteTop

3 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 08:05:14 得分 0

这下对了:一个   placement   arr   new   对应一个   placement   arr   delete  
  特点:   placement   *   delete   必须是   explicit   called.  
   
  int   main(){  
  char   place[8];  
  int   *   pint;  
   
  pint   =   new   (place)   int[2];  
   
  for(   int   i   =   0;   i   <   2;   i++){  
  cout<<(*pint)<<endl;  
  }  
   
   
  ::operator   delete   []   (place,   pint);  
   
   
  return   0;  
   
  }  
   
  参考资料:  
  http://216.239.57.104/search?q=cache:GOmbJKynNngJ:anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1995/N0642.pdf+placement+delete&hl=zh-CN&ie=UTF-8Top

4 楼Wendydd(温迪)回复于 2003-11-03 10:12:00 得分 0

值得研究!  
  收藏先  
  :)Top

5 楼xiaoyunet(快乐的小猪)回复于 2003-11-03 10:39:00 得分 0

不要调用delete操作符,他会试图去释放内存。这会引起程序崩溃。  
   
  注意:调用placement   new在这里只是执行了构造函数。  
  也就是说我们只要先是调用析构函数就可以了,不必去释放内存。  
   
  不过不鼓励搂住这种做法,在栈上的内存不要用在placement   new上。这简直是罪过。  
   
  Top

6 楼sham2k(sham2k)回复于 2003-11-03 12:49:56 得分 0

玩这些技巧有意义吗?Top

7 楼jeckyz(深圳)回复于 2003-11-03 13:36:02 得分 0

我同意   Wolf0403(完美废人)兄   的解释   :)   在一个已知的地址上进行   placement   new   ,编译器一般只实施对象初始化(也就是调用相应的构造函数).  
   
  言下之意就是,如果那个已知的内存块是动态分配的,那么就终销毁的也应该是这块内存,在此之前应该显式地调用所创建对象的释构函数(C++需要显式调用释构函数的情形之一);   如果是一个   local   variable   (在栈上),   那么为了安全起见,就只需要显式调用释构函数就行了,因为栈变量的内存是由编译器根据不同的调用策略来处理/释放的.  
   
  有没有这样使用的必要,我也说不上来,或许哪一天真的有了.呵呵,   献丑至此,   有不恰当之处,请不吝指教!    
   
  Top

8 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-03 13:57:33 得分 0

看看我提供的代码就知道,placement   new   对应的   placement   delete   除了调用析构函数,不执行内存操作。所以,出于良好编程习惯的考虑,调用   placement   delete   还是应该的。  
   
  “在栈上的内存不要用在placement   new上。这简直是罪过。”  
   
  精彩。Top

9 楼liao2001(知之为知之,不知为不知。。。)回复于 2003-11-03 14:05:33 得分 0

呵呵,这就是c++程序员们Top

10 楼jazzny(寒风)回复于 2003-11-03 14:51:32 得分 0

hehe,   我也只是想试试玩而已拉,   不过用new在heap上申请内存,   在这块内存的结尾处,   是不是有个表示结束的系统标记了?  
   
  望高人详细解释一下Top

11 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-11-10 00:46:11 得分 0

呵呵,compiler   magic   啦,谁知道呢。  
  所以我建议用   placement   delete   来清理一下,不管什么   magic   都给我收场去,呵呵。Top

相关问题

  • VB怎么用代码弹出打印对话框? 怎么用代码设置默认打印机?
  • 怎么在asp代码里弹出对话框?
  • 弹出模式对话框的代码怎么写?
  • 代码过长怎么办?
  • 我的代码怎么了?
  • 这段代码怎么写?
  • 这句代码怎么写
  • 这个怎么写代码?
  • 怎么读源代码啊?
  • 不出现提示对话框,直接关闭页面的代码怎么写?

关键词

  • pint
  • place

得分解答快速导航

  • 帖主:jazzny

相关链接

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

广告也精彩

反馈

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