[英]c++ scope of variable
我很难记住在c ++中,即使在执行离开该块之后,只要指针指向该块中定义的局部(非静态,并且在块内部)变量是否被破坏。 因此,如果我在一个块内创建一个int并有一个全局指针,然后离开该块,我的指针还能找到该int吗?
我没有在网上找到明确的答案,尽管可能已经被多次回答,对此感到抱歉。
不,您处于未定义的行为区域。
我假设您的意思是:
int* p = NULL;
{
int x = 0;
p = &x;
}
//p is a dangling pointer
如果尝试在}
之后取消p
引用,则会遇到麻烦(或者更糟的是,您将不会遇到麻烦,并且看起来好像正在工作)。
但是,您可以重新分配指针,例如
p = new int();
完全可以。
但是,以下内容是合法的(作为使用new
或malloc
分配动态内存的替代方法):
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.