2012-06-18 79 views
1

我很难记住,在C++中,块中定义的本地(非静态和块内)变量是否被销毁或者只要指针指向该变量,即使执行离开后该块。 所以,如果我在一个块内创建了一个int,并且有一个全局指针,并且我离开该块,那么我的指针是否仍然可以找到该int?C++变量范围

我没有在网上找到明确的答案,虽然它可能已经被回答了不止一次,对此抱歉。

+4

查找'dangling pointer'。 – chris

+0

谢谢。得到它了。 – bob

+0

为了您的方便:http:// stackoverflow。com/questions/5278859/c-dangling-pointer-question – dwalter

回答

5

不,你在未定义的行为领土。

我假设你的意思是这样:

int* p = NULL; 
{ 
    int x = 0; 
    p = &x; 
} 
//p is a dangling pointer 

如果}后试图取消引用p,你会遇到麻烦(或更糟的是,你会不会和它看起来像它的加工)。

但是,您可以重新分配的指针,所以像

p = new int(); 

是完全确定。

下面将是合法虽然(作为替代分配与newmalloc动态存储器):

int* p = NULL; 
{ 
    static int x = 0; 
    p = &x; 
} 
*p = 0; 
+0

所以为了清楚起见,解决这个问题的方法是,你用malloc为这个变量保留一个内存空间,对吗?如何更复杂的变量(对象),这仍然适用?当执行离开创建它的块时,该对象是否被销毁? – bob

+0

@bob是的,这与用户定义的类型相同。 –

+0

“是”是指什么,在我以前的评论中有两个问题。 – bob

0

变量或物体上的范围内定义的(分隔块大括号,称为语句块,一个复合语句或简称为块)被称为自动变量,因为它们具有自动寿命,或duration.That是,编译器自动地破坏它们时的范围中定义它们的端部。 一般来说,出现这种情况时,函数体(局部范围)会退出:

void function() 
{ 
    X obj;  // object of type X is created here 
} // local scope ends here: obj is destroyed 

,如果你绑定的引用或指针到本地自动变量,你是在自找麻烦,因为你正在做的地址在这是怎么回事,当功能ends.Because的标准没有规定会发生什么其次要被释放的内存位置的,行为被认为是不确定的指针被说成是晃来晃去

X *ptr=nullptr; 

void function() 
{ 
    X obj; 
    ptr=&obj; 
} // obj is destroyed here: what does ptr points to now?? 

当您动态分配内存时(通过关键字)你没有创建一个本地对象,当范围退出时,编译器会完成这个本地对象,但是一个对象的生命周期取决于你编写的代码。 您有责任创建它,并且您负责处理它,您将其调用删除指向它。

X *ptr=nullptr; 

void function() 
{ 
    ptr=new X; 
} // nothing is destroyed here: ptr still points to an (unnamed) object of type X 

不要紧的对象的类型,这同样适用于一个原语,或内置的类型和用户定义的,或类的类型。