堆上的对象什么时候超出范围

whi*_*win 6 c++ scope

考虑以下程序:

int main() {

    while(...) {
        int* foobar = new int;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

什么foobar时候超出范围

我知道在使用时new,属性是在堆上分配的,需要手动删除delete,在上面的代码中,它会导致内存泄漏.但是,范围呢?

一旦while循环终止,我认为它会超出范围,因为你不再能直接访问它了.例如,delete在循环终止后你不能这样做.

dmc*_*kee 13

这里要小心,foobarwhile循环是本地的,但堆上的分配没有作用域,只有在你调用delete时才会被破坏.

就编译器而言,变量和分配不以任何方式链接.实际上,分配发生在运行时,因此编译器甚至从未看到它.

  • @MooingDuck:我推荐`int` ;-p (8认同)

Ker*_* SB 9

foobar 是一个局部变量,在块的末尾超出范围.

*foobar是具有手动生命周期的动态分配对象.因为它没有范围的一生中,这个问题是没有意义的-它不具备一个范围外面就可以去.它的生命周期是手动管理的,对象一直存在,直到你delete.

你的问题充满了偏见和先入之见.最好以干净的头脑和开放的态度来接近C++.只有这样,你才能最大限度地欣赏语言的奇迹.


这是干净和开放的方法:考虑 1)存储类(自动,静态,动态),2)对象生命周期(范围,永久,手动),3)对象语义(值(副本)与引用(别名)), 4)RAII和单一责任类.清除你的想法 a)堆栈/堆,b)指针,c)new/delete,d)析构函数/复制构造函数/赋值运算符.