2015-12-03 145 views
0

我听说这是未定义的行为。当悬挂指针被删除时会发生什么?

但实际上会发生什么?

它是一个崩溃或其他事情也可能发生?

它有可能进入一个无限循环>如果是这样,那么这是什么时候发生的?

+2

这很大程度上取决于C运行时库和配置的特定实现(即gcc/msvc可能会有不同的行为,调试和释放msvc堆会做不同的事情等)。 – stgatilov

+0

“实际上会发生什么?”那么,它是不确定的,所以我们不知道。理论上它可以打开你的车库门。也许你是指特定的编译器/操作系统? – AndyG

回答

2

当您因任何原因访问“悬挂指针”时,可能发生不良事件,则不会发生任何事情或“事情”可能发生。这一切都取决于发生了什么。例如:

int* intp = new int; 
*intp = 8; 
delete intp; 
std::cout << "intp: " << *intp << std::endl; 

这可能会打印8,它可能会打印一些随机数,或者它可能会崩溃。这完全取决于内存被删除后发生了什么。

这就是为什么它被称为未定义的行为。没有办法知道将要发生什么。

0

由于没有真正的方法来预测会发生什么,所以它被称为'未定义'。

访问一个悬挂指针可能会破坏内存,如果你正在写东西,它会崩溃程序,你可能会遇到一个边界错误,或者它可能指向一个新的对象,这取决于它发生了什么你删除了它。

void main(){ 
char *dp = NULL; 

    try{ 
    char c; 
    dp = &c; 
    } 
    catch(...){ 
    printf("ex thrown"); 
    } 
/* c falls out of scope */ 
/* dp is 'now' a dangling pointer */ 
    delete &dp; // deleting a dangling pointer 
} 

在这个例子中,它的行为是随机的。它可能会崩溃,或者它可能指向另一个对象,取决于它所在的内存发生了什么。

相关问题