我是C++的初学程序员,对变量有疑问.
例如,如果我有这个方法:
int wow()
{
int x = 99;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当此方法退出(返回0)时,它是否会破坏变量x?
这个变量是存储在堆栈还是堆中?
我知道你可以做int*x = new int(99),然后它会在堆中.
但没有*,它是否在堆栈内?
并且在上面的方法中,当它退出时,x被破坏了吗?
当此方法退出(返回0)时,它是否会破坏变量x?
是.x具有自动存储持续时间,并且当它超出范围时被销毁 - 在这种情况下,当函数返回时.
这个变量是存储在堆栈还是堆中?
在堆栈上.
我知道你可以这样做
int *x = new int(99),然后它会在堆中.
确实; 创建的对象new具有动态存储持续时间,并且位于堆上.请注意,还有第二个对象x,指向堆上对象的指针.x本身是堆栈中的自动对象.(讽刺的是,C++将动态内存的来源称为"免费商店",而不是"堆").
但没有它
*,它是否在堆栈内?
没有*,那就不会编译.new在堆中创建一个从堆中取出的对象,并给出它的地址.*表示这x是一个指针,所以可以保存该地址.没有它,它将会int而且不能保留地址.
并且在上面的方法中,当它退出时,x被破坏了吗?
指针x是; 但它指出的对象不是.动态对象(使用new)创建,直到它们被显式销毁delete.如果这种情况从未发生过,那么就会发生内存泄漏 - 内存已分配但从未发布.
除非你真的需要,否则避免动态分配; 当你这样做时,总是使用智能指针,容器等来安全地管理它,并避免使用new和处理原始指针.