由一次程序崩溃引起的对 new 表达式的再次学习

发表于:2016-5-09 10:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:tryflying    来源:51Testing软件测试网采编

  1. 起因
  某天,一个同事跟我反馈说在windows上调试公司产品的一个交易核心时出现了使用未初始化的指针导致后台服务崩溃的情况。示例代码如下所示:
struct sample
{
int* ptr_table[4][4];
//... other members
};
void test()
{
sample* sample_ptr = new sample[10];
for (int i = 0; i < 4; i++)
sample_ptr[0].ptr_table[0][i] = new int(i);
// 实际系统中是根据初始化数据对sample_ptr数组中的对象进行赋值,但不是所有的对象都有初始化数据;
int* int_ptr = sample_ptr[0].ptr_table[0][0];
if (int_ptr != NULL)
{
printf("ptr1 = 0x%x\n", int_ptr);
*int_ptr = 100;
}
int_ptr = sample_ptr[1].ptr_table[0][0];
if (int_ptr != NULL)
{
printf("ptr2 = 0x%x\n", int_ptr);
*int_ptr = 100; // crashed here!
}
}
  
  将sample* sample_ptr = new sample[10]这行改为sample* sample_ptr = new sample[10]()后两个系统执行的结果变一样了,都是被初始化的内存。
  那么问题来了:
  (1) 为什么相同的代码(new sample[10])在两个系统下表现形式不一样呢?是两个系统的内存分配机制的原因还是类库的原因?
  (2) new sample[10]和new sample[10]()的区别到底是什么?
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号