我很难记住在c ++中,只要指针指向它,就会破坏块中定义的局部(非静态和块内)变量,即使在执行离开块之后也是如此。 所以,如果我在一个块中创建一个int,并且有一个全局指针,并且我离开了块,那么我的指针仍然可以找到那个int吗?
我没有在网上找到明确的答案,虽然它可能不止一次得到回答,对此感到抱歉。
答案 0 :(得分:5)
不,您处于未定义的行为区域。
我假设你的意思是:
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;
答案 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
对象的类型无关紧要,这同样适用于基元或内置类型以及用户定义或类类型。