来自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()
容易出现内存泄漏吗?
提前致谢。
答案 0 :(得分:8)
Foo foo();
通过名称foo
声明一个函数,它返回一个Foo
对象并且不接受任何参数。它被称为C ++中最令人烦恼的解析。你可能意味着:
Foo foo;
它在本地创建foo
对象/自动存储。一旦声明它的范围{ }
结束,该对象就会被自动释放。
Foo *foo = new Foo(); // allocates foo on the heap
delete foo;
这是真的,一旦你调用foo
,delete
指向的freestore上的对象就会被释放。没有内存泄漏。
Foo foo = *new Foo();
在freestore上分配Foo
对象,然后使用该对象的副本初始化foo
。由于您没有指向freestore分配对象的指针,因此会导致内存泄漏。请注意,如果Foo
的析构函数有一些导致副作用的代码,那么它不仅仅是内存泄漏,而是未定义的行为。