распределение c ++ в стеке действует с любопытством - PullRequest
5 голосов
/ 19 февраля 2010

Любопытные вещи с g ++ (может также с другими компиляторами?):

struct Object {
        Object() { std::cout << "hey "; }
        ~Object() { std::cout << "hoy!" << std::endl; }
};

int main(int argc, char* argv[])
{
        {
                Object myObjectOnTheStack();
        }
        std::cout << "===========" << std::endl;
        {
                Object();
        }
        std::cout << "===========" << std::endl;
        {
                Object* object = new Object();
                delete object;
        }
}

По сравнению с g ++:

===========
hey hoy!
===========
hey hoy!

Первый тип размещения не создаетобъект .Чего мне не хватает?

Ответы [ 3 ]

12 голосов
/ 19 февраля 2010

Первый тип конструкции фактически не создает объект. Чтобы создать объект в стеке с использованием конструктора по умолчанию, необходимо пропустить () 's

Object myObjectOnTheStack;

Вместо этого ваш текущий стиль определения объявляет функцию с именем myObjectOnTheStack, которая возвращает Object.

4 голосов
/ 19 февраля 2010

Еще один пример "самого неприятного разбора". Вместо определения объекта вы объявили функцию с именем myObjectOnTheStack, которая не принимает аргументов и возвращает Object.

2 голосов
/ 19 февраля 2010
Object myObjectOnTheStack();

- это предварительное объявление функции myObjectOnTheStack, которая не принимает параметров и возвращает Object.

. То, что вы хотите, это

Object myObjectOnTheStack;
...