C ++在堆和堆栈上分配内存?

时间:2013-02-24 07:07:17

标签: c++ memory-management stack heap

来自Java背景,我仍然对在C ++中分配内存感到困惑。我很确定前两个陈述是正确的:

void method() {
    Foo foo;    // allocates foo on the stack, and the memory is freed
                // when the method exits
}

void method2() {
    Foo *foo = new Foo();   // allocates foo on the heap
    delete foo;             // frees the memory used by foo
}

但是这样的事情呢?

void method3() {
    Foo foo = *new Foo();   // allocates foo on the heap, and then copies it to the stack?
                            // when the method exits, the stack memory is freed, but the heap memory isn't?
}

假设我将foo添加到method3()内的全局数组中。如果我在方法退出后尝试访问foo个数据成员之一,那会有用吗?并且method3()容易出现内存泄漏吗?

提前致谢。

1 个答案:

答案 0 :(得分:8)

Foo foo(); 

通过名称foo声明一个函数,它返回一个Foo对象并且不接受任何参数。它被称为C ++中最令人烦恼的解析。你可能意味着:

Foo foo; 

它在本地创建foo对象/自动存储。一旦声明它的范围{ }结束,该对象就会被自动释放。


Foo *foo = new Foo();   // allocates foo on the heap
delete foo;

这是真的,一旦你调用foodelete指向的freestore上的对象就会被释放。没有内存泄漏。


 Foo foo = *new Foo(); 

在freestore上分配Foo对象,然后使用该对象的副本初始化foo。由于您没有指向freestore分配对象的指针,因此会导致内存泄漏。请注意,如果Foo的析构函数有一些导致副作用的代码,那么它不仅仅是内存泄漏,而是未定义的行为。