我很难记住,在C++中,块中定义的本地(非静态和块内)变量是否被销毁或者只要指针指向该变量,即使执行离开后该块。 所以,如果我在一个块内创建了一个int,并且有一个全局指针,并且我离开该块,那么我的指针是否仍然可以找到该int?C++变量范围
我没有在网上找到明确的答案,虽然它可能已经被回答了不止一次,对此抱歉。
我很难记住,在C++中,块中定义的本地(非静态和块内)变量是否被销毁或者只要指针指向该变量,即使执行离开后该块。 所以,如果我在一个块内创建了一个int,并且有一个全局指针,并且我离开该块,那么我的指针是否仍然可以找到该int?C++变量范围
我没有在网上找到明确的答案,虽然它可能已经被回答了不止一次,对此抱歉。
不,你在未定义的行为领土。
我假设你的意思是这样:
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;
变量或物体上的范围内定义的(分隔块大括号,称为语句块,一个复合语句或简称为块)被称为自动变量,因为它们具有自动寿命,或duration.That是,编译器自动地破坏它们时的范围中定义它们的端部。 一般来说,出现这种情况时,函数体(局部范围)会退出:
void function()
{
X obj; // object of type X is created here
} // local scope ends here: obj is destroyed
,如果你绑定的引用或指针到本地自动变量,你是在自找麻烦,因为你正在做的地址在这是怎么回事,当功能ends.Because的标准没有规定会发生什么其次要被释放的内存位置的,行为被认为是不确定的指针被说成是晃来晃去:
X *ptr=nullptr;
void function()
{
X obj;
ptr=&obj;
} // obj is destroyed here: what does ptr points to now??
当您动态分配内存时(通过关键字新)你没有创建一个本地对象,当范围退出时,编译器会完成这个本地对象,但是一个对象的生命周期取决于你编写的代码。 您有责任创建它,并且您负责处理它,您将其调用删除指向它。
X *ptr=nullptr;
void function()
{
ptr=new X;
} // nothing is destroyed here: ptr still points to an (unnamed) object of type X
不要紧的对象的类型,这同样适用于一个原语,或内置的类型和用户定义的,或类的类型。
查找'dangling pointer'。 – chris
谢谢。得到它了。 – bob
为了您的方便:http:// stackoverflow。com/questions/5278859/c-dangling-pointer-question – dwalter