C++内存管理 - 堆栈和堆

Tra*_*ier 0 c++ ram manual

我是C++的初学程序员,对变量有疑问.

例如,如果我有这个方法:

int wow() 
{
    int x = 99;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当此方法退出(返回0)时,它是否会破坏变量x?

这个变量是存储在堆栈还是堆中?

我知道你可以做int*x = new int(99),然后它会在堆中.

但没有*,它是否在堆栈内?

并且在上面的方法中,当它退出时,x被破坏了吗?

Mik*_*our 5

当此方法退出(返回0)时,它是否会破坏变量x?

是.x具有自动存储持续时间,并且当它超出范围时被销毁 - 在这种情况下,当函数返回时.

这个变量是存储在堆栈还是堆中?

在堆栈上.

我知道你可以这样做int *x = new int(99),然后它会在堆中.

确实; 创建的对象new具有动态存储持续时间,并且位于堆上.请注意,还有第二个对象x,指向堆上对象的指针.x本身是堆栈中的自动对象.(讽刺的是,C++将动态内存的来源称为"免费商店",而不是"堆").

但没有它*,它是否在堆栈内?

没有*,那就不会编译.new在堆中创建一个从堆中取出的对象,并给出它的地址.*表示这x是一个指针,所以可以保存该地址.没有它,它将会int而且不能保留地址.

并且在上面的方法中,当它退出时,x被破坏了吗?

指针x是; 但它指出的对象不是.动态对象(使用new)创建,直到它们被显式销毁delete.如果这种情况从未发生过,那么就会发生内存泄漏 - 内存已分配但从未发布.

除非你真的需要,否则避免动态分配; 当你这样做时,总是使用智能指针,容器等来安全地管理它,并避免使用new和处理原始指针.