c ++变量范围

时间:2012-06-18 13:05:42

标签: c++

我很难记住在c ++中,只要指针指向它,就会破坏块中定义的局部(非静态和块内)变量,即使在执行离开块之后也是如此。 所以,如果我在一个块中创建一个int,并且有一个全局指针,并且我离开了块,那么我的指针仍然可以找到那个int吗?

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

在范围内定义的变量或对象(花括号分隔的块,称为语句块,复合语句或简单的块)称为自动变量,因为它们具有自动生命周期或持续时间。也就是说,编译器自动在它们定义的范围结束时销毁它们。 通常,当退出函数体(本地范围)时会发生这种情况:

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

如果你绑定一个引用或一个指向本地自动变量的指针,你就会遇到麻烦,因为你在内存中一个位置的地址将在函数结束时被释放。因为标准确实存在不指定接下来会发生什么,行为被认为是未定义的,指针被称为悬空

X *ptr=nullptr;

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

当您动态分配内存时(通过关键字 new ),您不会创建一个本地对象,当退出作用域时,编译器将完成该对象,但是生命周期为由您编写的代码决定。 您负责创建它并且您负责处理它,您可以在指向它的指针上调用 delete

X *ptr=nullptr;

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

对象的类型无关紧要,这同样适用于基元或内置类型以及用户定义或类类型。