Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我在for中声明一个对象,它是否';在那之后,谁的内存被释放了?_C++ - Fatal编程技术网

C++ 如果我在for中声明一个对象,它是否';在那之后,谁的内存被释放了?

C++ 如果我在for中声明一个对象,它是否';在那之后,谁的内存被释放了?,c++,C++,如果我在for中声明和对象,例如将其地址分配给指针,那么当for结束时,指针是否指向无效内存?就像它发生在一个方法的末尾,该方法中声明了对象一样,当for循环完成时,变量将在堆栈上并超出范围。如果在堆上分配内存,并将其分配给在for循环中声明的指针,那么当for循环结束时,内存将具有一个悬空引用,因为本地引用不再存在。是,而不仅仅是在任何块内 例如: void bar() { foo* p; { foo f; p = &f; } // p

如果我在for中声明和对象,例如将其地址分配给指针,那么当for结束时,指针是否指向无效内存?就像它发生在一个方法的末尾,该方法中声明了对象一样,当for循环完成时,变量将在堆栈上并超出范围。如果在堆上分配内存,并将其分配给在for循环中声明的指针,那么当for循环结束时,内存将具有一个悬空引用,因为本地引用不再存在。

是,而不仅仅是在任何块内

例如:

 void bar()
 {
   foo* p;
   {
     foo f;
     p = &f;
   }
   // p no longer points to a valid object, f has ended its lifetime
与的
相同,只是每次循环运行时都会创建/销毁对象

现在,如果您有:

 void bar()
 {
   foo* p;
   {
     foo* f = new foo;
     p = f;
   }
   // p is still valid here, you need to clean up yourself with delete

如果在for中执行此操作,则需要非常小心,不要泄漏所有这些分配。

{
}
块中声明的任何对象在退出该块时都会被销毁,而不管该块是否作为复合语句的一部分使用(例如
for
循环的主体)。指向此类对象的所有指针也将变得无效


EDIT正如0A0D正确指出的那样,使用
new
创建的对象的生存期受到明确控制;它们可以从块中退出,但也需要手动删除。

在堆栈上创建的对象(不使用new/malloc/etc…)将在作用域结束时销毁。所以,是的

在堆上创建的对象(使用new/malloc/etc…)不是,您需要调用delete/free/etc。。你是说:

for(init; condition; upd)
 {
     ThisIsAClass anObject;
     // do something, like even assigning the obj address to
     // a var declared outside the loop
 } 

 // here, the pointer to anObject can be used?

答案是否定的。它(对象)“消失”超出范围。

如果静态声明它,则是。如果它是动态的,那么不是

例如,此将被释放

for (...)
{
   Foo f;
}
但是这个不会

for (...)
{
    Foo * f = new Foo();
}

for语句具有以下语法:

for (init cond; expr) statement
相当于:

{
    init
    while (cond)
    {
        statement
        expr;
    }
}
因此,for循环中定义的所有内容都会在循环结束时结束其生命周期,包括内部表达式和完整控制结构。指向不再存在的东西是错误的

一般而言:

void* p;

{
    T x;
    p = &x;
} // x no longer exists

// p no longer holds a valid value

除非您在该块内调用
new
。。应该删除它。@0A0D您是对的,我的陈述不包括动态创建的对象。可能应该澄清所有内容的含义,因为如果它是新的,那么情况就不同了。。请参阅@Mat的答案。@GManNickG好的,谢谢,但它们在循环的每次迭代结束时或在常规结束时结束生命?@0A0D:它们一点也不不同。每个对象都会被破坏,其生命周期也会结束。指针只是没有所有权语义。这与寿命无关,这是指针的事情。当然,你的
new
不会消失,除非它们被
delete
'd.@XaitormanX:正如你所看到的,两者都是
expr
被包装在
{
}
中,因此其中的所有内容都将随着迭代的结束而结束其生命周期,而整个循环被包装在
{
}
中,因此循环体之外但控制结构内的所有内容也将随着整个控制循环的结束而结束其生命周期。@GManNickG:Yes,他就是这么问的。。“在这之后内存是否会被释放”
foo*f=new foo()
在循环中动态创建的答案不会在
for循环之后发布,除非您手动执行。好的,非常感谢您,当您看到各种不同的(全部正确)答案时,我会尽快(4分钟)接受您的答案,所有答案都是上下选的,而您的答案是唯一的(目前)被否决(当然没有解释),你不认为有人把你作为目标,不仅仅是因为答案的质量,而是因为答案是你?我碰巧这么想。