Разница в том, что отладчик, библиотеки отладки и код, построенный в режиме «отладки», любят ломать вещи, которые должны ломаться. Ваш код должен сломаться (поскольку он обращается к памяти, которой он больше не владеет), поэтому он легче ломается при компиляции для отладки и запуска в отладчике.
В реальной жизни вы, как правило, не получаете такого неубедительного уведомления. Все то, что заставляет вещи ломаться, когда они должны быть в отладчике ... это дорого. Так что это не проверено так строго в выпуске. Возможно, вам удастся в 99 раз из 100 освободить память и получить к ней доступ сразу же, потому что библиотеки времени выполнения не всегда сразу возвращают память в ОС. Но в сотый раз или память ушла, или другой поток теперь владеет ею, и вы получаете длину строки, которая больше не является строкой, а содержит массив из 242462649-байтового дерьма, который стремительно превращается в нераспределенный (и, следовательно, не существующей, насколько вам или во время выполнения должно заботиться) памяти. И почти ничего не скажу вам, что только что произошло.
Так что не делай этого. Как только вы удалили что-то, считайте это мертвым и ушедшим. Или вы будете тратить половину своей жизни на выслеживание гейзенгов.