2013-02-24 5 views
7

Исходя из фона Java, я все еще немного запутался в распределении памяти на C++. Я уверен, что первые два утверждения верны: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

'Foo foo();' фактически ничего не выделяет. Он объявляет функцию. – chris

ответ

8
Foo foo(); 

Объявляет функцию по имени foo, который возвращает объект Foo и не принимает никаких аргументов. Он известен как самый неприятный синтаксический анализ на C++. Вы, вероятно, имел в виду:

Foo foo; 

Это создает foo объект локально/автоматическое хранение. Объект автоматически освобождается после того, как область { }, в которой она объявлена, заканчивается.


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

Это верно, объект на FreeStore указываемого foo освобождается, когда вы звоните delete. Нет утечки памяти.


Foo foo = *new Foo(); 

Выделяет Foo объект на FreeStore, а затем копию этого объекта используется для инициализации foo. Поскольку у вас нет указателя на выделенный выделенный объект, он вызывает утечку памяти. Обратите внимание, что если деструктор Foo имеет некоторый код, который вызывает побочные эффекты, то это не просто утечка памяти, но неопределенное поведение.

+0

Я имел в виду 'Foo foo()' для вызова конструктора аргументов no для класса 'Foo'. Но вы правы, я изменю его в вопросе, чтобы избежать путаницы. – nebulabrot

+1

@nebulabrot: 'Foo foo;' делает это, а не 'Foo foo();' –

+0

Почему неопределенное поведение, если в Foo destructor присутствуют побочные эффекты? Я могу придумать пару примеров с сложным «Foo», где он будет работать нормально, даже без утечки памяти! – CygnusX1

Смежные вопросы