2016-03-02 2 views

ответ

6

Это является освобождение памяти, но это не обнуление его, так что это просто так получилось, что он все еще содержит свое прежнее значение.

Ваше использование памяти после ее освобождения (в вызове wcout) - неопределенное поведение. Это появляется для работы, но only by accident.

+0

Кроме того, будьте осторожны, чтобы не путать «освобождение памяти» с «разрушением его содержимого»; один не означает другого. – andlabs

+0

@ и это просто общее утверждение? Потому что мы говорим о строках здесь, а персонажи - это фундаментальные типы, которые не нужно уничтожать. –

+0

Уничтожение в буквальном смысле; процесс освобождения не гарантированно перезаписывает символы случайным мусором, и даже не требуется возвращать память в ОС, поэтому попытка получить к нему доступ снова будет ошибкой. – andlabs

0

В этом конкретном случае освобождения BSTR нет необходимости освобождать его, вы правы, это не значит, что он не обнуляется или не определяется поведением. Выделение BSTR кэшируется, поэтому, когда выделенный выделенный SysFreeString() блок сразу не уходит, он остается кэшированным для последующего использования. Это контролируется переменной OANOCACHE и функцией SetOaNoCache.

Смежные вопросы