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

时间:2014-04-19 11:30:37

标签: c++ ram manual

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

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

int wow() 
{
    int x = 99;
    return 0;
}

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

  

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

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

  

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

在堆栈上。

  

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

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

  

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

没有*,那就不会编译。 new在从堆中取出的内存中创建一个对象,并给出它的地址。 *表示x是指针,因此可以保存该地址。没有它,它将是int并且无法保存地址。

  

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

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

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

答案 1 :(得分:1)

int x = 99;在堆栈上声明一个变量。

它被摧毁了#34;当函数返回时,内存被释放以供其他函数使用,但通常没有明确的擦除。

为了更明确地了解 destroy ,这意味着下次我们查看该内存位置时,我们无法可靠地期望相同的值存在。但是,由于没有明确的覆盖,下次我们查看内存位置时有可能会出现这种情况。

在声明中使用时澄清*符号。

int *ptr声明一个指向整数的指针,但是这个指针可以指向堆栈或堆,具体取决于你决定指向它的位置。

堆:

int* ptr = new int(100);
int* ptr2 = ptr; // Now you have two pointers to the same location in the heap

堆叠

int stackMe = 100;
int* ptrToStack = &stackMe; // Point ptrToStack at an `int` on the stack.

在任何一种情况下,您都可以通过指针修改值。

*ptr = 5; // set the `int` that ptr points to, to 5.

答案 2 :(得分:1)

在您的情况下,x通常会保存在处理器寄存器中,而不会占用任何内存(使用优化编译器)。如果编译器需要释放寄存器,它会将变量溢出到堆栈。

编译器永远不会自动在堆上放置对象。