Для начала прочитайте
эти объяснения. Осознайте, что существует 2 принципиально разных способа хранения информации - на стеке и в "динамической памяти". Для объектов на стеке не надо дополнительно резервировать память, и они автоматически удаляются при выходе из функции.
Выделить память автоматически, разумеется, нельзя. Дело в том, что часто нам не известен размер памяти, которую необходимо выделить. Однако, в большинстве случаев можно использовать стандартные типы данных, например, std::vector, в которых эти операции написаны за вас. В реальном коде может практически не быть в ручную вызываемых операций delete благодаря использованию "умных указателей".
В вашем случае далеко не факт что проблема именно в этом. Возможно, вы обращаетесь за границы какого-то массива или пытаетесь что-то повторно удалить, или одна из десятков других причин. Различное поведение может объясняться различным режимом сборки debug/release, или, скорее всего, вам "везет" в виртуалке, и вы не вылезаете за пределы зарезервированной для вашего приложения памяти.
P.S. Почитайте умных книжек по C++, без этого не как. Начните с
этой, например.