战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

今天qq某大侠问我,为啥他的代码会crash

char* pdata = new char(14245);
::memset( pdata, 0, 14245 );

我马上运行代码,结果果真是Access Violent。

之后试过malloc都没有问题

随机我把这段代码删除,过了几分钟后,我按照记忆,重新写下代码

char* pdata = new char[14245];
::memset( pdata, 0, 14245 );

结果不crash了。细细一看
 
 
 
 
 
 
为啥要调用char的构造函数传入14245的参数呢?这样只能new出来1个字节,但是memset又写了14245个字节,不挂才有鬼了
之后问过很多人,基本都没看出来,可见这个写法极其骗人
posted on 2009-09-03 16:10 战魂小筑 阅读(1266) 评论(3)  编辑 收藏 引用 所属分类: 程序调试技术C++/ 编程语言

评论

# re: 经典的C++内存分配导致crash的案例 2009-09-03 16:28 AS
这个是算是个C++ 错误的一个障眼法.
过不了多久就容易看出错误,
但是很容易再眼皮底下跑调.

为什么呢?
对于分配小内存,它表现似乎也是很正常的.

内存垃圾回收还是有很大价值的帮你避免这类问题的.  回复  更多评论
  

# re: 经典的C++内存分配导致crash的案例[未登录] 2009-09-03 16:37 Davy.xu
你小子别拿着这个问题到处害人  回复  更多评论
  

# re: 经典的C++内存分配导致crash的案例[未登录] 2010-06-07 13:46 mao
是这样new char[14245]  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理