Вы уверены, что ваша ошибка во время выполнения действительно происходит в функции InsertAfter? Мне кажется, что когда вы изменяете stringLength, вы должны получить нарушение прав доступа в OutputString, потому что вы на самом деле еще не добавили символы. Добавление предложения (temp! = NULL) в цикл while почти позволяет избежать этого, но посмотрите, что произойдет, если вы фактически выйдете из цикла из-за того, что temp станет NULL ...
Отвечая на ваши комментарии: боюсь, я все еще немного скептически отношусь к тому, где происходит эта ошибка во время выполнения! Если код действительно такой, как приведенный в вопросе, и при условии, что вы не получили испорченную сборку, наличие AV или чего-то еще в InsertAfter было бы практически невозможным (хорошо, это опасно говорить в C ++, но эй - вы просто меняете значение члена объекта, который расположен в стеке). Обратите внимание, что вы не можете сказать, что ошибка возникает в методе InsertAfter только потому, что она исчезает, если вы ее не вызываете - действительно, ошибка в OutputString обнаруживается только при вызове InsertAfter, поэтому она должна исчезнет, если будет удален вызов InsertAfter. Чтобы проверить, используйте отладчик или добавьте некоторые записи в InsertAfter, как до, так и после подозрительного оператора.