繁体   English   中英

c ++变量范围

[英]c++ scope of variable

我很难记住在c ++中,即使在执行离开该块之后,只要指针指向该块中定义的局部(非静态,并且在块内部)变量是否被破坏。 因此,如果我在一个块内创建一个int并有一个全局指针,然后离开该块,我的指针还能找到该int吗?

我没有在网上找到明确的答案,尽管可能已经被多次回答,对此感到抱歉。

不,您处于未定义的行为区域。

我假设您的意思是:

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;

在范围内定义的变量或对象(用花括号分隔的块,称为语句块,复合语句或简称为块)称为自动变量,因为它们具有自动生存期或持续时间。也就是说,当编译器在运行时自动销毁它们。它们定义的范围是终点。 通常,在退出函数体(局部作用域)时会发生这种情况:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM