1

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

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

4

2 回答 2

5

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

我假设你的意思是:

int* p = NULL;
{
   int x = 0;
   p = &x;
}
//p is a dangling pointer

如果您尝试在p之后取消引用},您会遇到麻烦(或者,更糟糕的是,您不会这样做,并且看起来它正在工作)。

但是,您可以重新分配指针,例如

p = new int();

完全可以。

以下是合法的(作为使用newor分配动态内存的替代方法malloc):

int* p = NULL;
{
   static int x = 0;
   p = &x;
}
*p = 0;
于 2012-06-18T13:11:00.280 回答
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

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

于 2015-09-18T11:23:10.577 回答