2012-12-05 123 views
-8
void show(int* x){ 
    printf("%d",x[3]); 
} 

int main(){ 
    int* ptr; 

    ptr = new int[9](); 
    delete [] ptr;  


    printf("%d %d\n", ptr[7], *(ptr+7)); 
    show(ptr); 

return 0; 
} 
+1

考虑提供更多的信息和问题 –

+2

也“不工作”的意思是,你仍然可以输出的价值?这可能只是未定义行为的一种情况。 –

+2

未定义的行为未定义。 –

回答

8

为什么你认为它不起作用?你分配9个整数,然后删除它们。这工作得很好。

问题是你然后访问那些被删除的整数。一旦你做了什么是无关紧要的 - 你在不确定的行为土地。它可能会显示旧的价值,它可能会崩溃或宇宙可能开始收缩。

+0

你做了我的一天。 –

+0

我希望取悦;) –

4

您正在调用未定义的行为通过访问已删除的动态分配数组的元素。这里没有“没有工作”,因为什么都可以发生ptr指向与delete之前相同的内存地址,并且当您尝试访问它时没有什么可以说明的位置。

2

指针在delete[]后没有失效,但指向的堆内存被释放,因此它不再被信任。这种类型的代码通常会在并行系统中引起头痛。

您可以通过删除后立即归零指针避免这种情况:

delete[] ptr; 
ptr = 0;