Во-первых, я вижу, что ваше "if (ch == '!' || ch == '&' || ch == '|')" не имеет смысла.Больше ничего они не могут быть.
Кроме того, если postfix - это std :: string, я уверен, что размер включает в себя завершающий нулевой символ.Так что, вероятно, он пытается что-то вставить туда.
В-третьих, если все это находится внутри функции, и вы возвращаете ссылку, как вы предлагаете (я не вижу фактического прототипа функции), которую вы пытаетесьчтобы вернуть ссылку на локальную переменную стека, которая должна быть уничтожена.
И, как указал Spinkoo, вы также пропускаете разрывы в вашем переключателе ...