8

来自 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()容易出现内存泄漏?

提前致谢。

4

1 回答 1

8
Foo foo(); 

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

Foo foo; 

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


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

这是真的,foo一旦你调用delete. 没有内存泄漏。


 Foo foo = *new Foo(); 

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

于 2013-02-24T07:14:53.877 回答