我很难记住在 C++ 中定义的本地(非静态和块内部)变量是否被破坏,只要指针指向它,即使在执行离开块之后也是如此。因此,如果我在块内创建了一个 int,并且有一个全局指针,然后我离开了该块,我的指针还能找到那个 int 吗?
我没有在网上找到一个明确的答案,虽然它可能已经回答了不止一次,对此感到抱歉。
我很难记住在 C++ 中定义的本地(非静态和块内部)变量是否被破坏,只要指针指向它,即使在执行离开块之后也是如此。因此,如果我在块内创建了一个 int,并且有一个全局指针,然后我离开了该块,我的指针还能找到那个 int 吗?
我没有在网上找到一个明确的答案,虽然它可能已经回答了不止一次,对此感到抱歉。
不,您处于未定义的行为领域。
我假设你的意思是:
int* p = NULL;
{
int x = 0;
p = &x;
}
//p is a dangling pointer
如果您尝试在p
之后取消引用}
,您会遇到麻烦(或者,更糟糕的是,您不会这样做,并且看起来它正在工作)。
但是,您可以重新分配指针,例如
p = new int();
完全可以。
以下是合法的(作为使用new
or分配动态内存的替代方法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
对象的类型无关紧要,这同样适用于原始类型或内置类型以及用户定义或类类型。