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]()的区别到底是什么?