Во-первых, это очень и очень плохая идея.
Во-вторых, вы не должны брать адрес временного объекта, поскольку он будет уничтожен после того, как точка с запятой будет достигнута, а указатель указывает на недопустимый объект. Я думаю, что эта строка даже не должна компилироваться! Используете ли вы какое-либо расширение Visual C ++?
first = &Node();
вы создаете временный элемент в стеке, вызывая Node()
, затем привязываете его адрес к указателю first
, затем временный уничтожается.
В-третьих, вы получаете исключение из-за этого:
ваш getItem()
метод возвращается по копии, а не по ссылке, поэтому однажды вызванный в pop()
по висячему указателю first
конструктор std::string
вызывается для копирования члена std::string item
, который недопустим, поскольку был уничтожен с самого начала.
В конструкторе копирования std::string
он считывает размер другой строки, которая оказывается случайными байтами в стек, поскольку исходная строка была уничтожена.
Это число очень велико, и Windows не может выделить для него память в куче, поэтому создается исключение типа std::bad_alloc
Если число было достаточно маленьким, но не меньше std::string
массива внутреннего стека, вы можете получить нарушение прав доступа, потому что конструктор копирования попытается скопировать бафф из-за неправильного адреса памяти. Или еще хуже! Вы можете испортить кучу или прочитать несколько случайных байтов, если этот кусок был связан с любым другим объектом в программе