Как стать автором
Обновить

Исследование нескольких проблем, обнаруженных при статическом анализе

Время на прочтение5 мин
Количество просмотров3.1K
Всего голосов 8: ↑6 и ↓2+6
Комментарии3

Комментарии 3

Но выделенный буфер никогда не освобождается (из-за ошибки). Этого можно надёжно избежать, если использовать std::vector, который позаботится о выделении и освобождении внутрисистемно

Да нет же. Просто array был размещен в куче, с использованием new, а std::vector на стеке, с автоматическим удалением. Если бы std::vector создавался в куче, была бы та же самая проблема.

Любой контейнер сам по себе размещается в том контексте, где его создали, от самого контейнера не зависит, стек это, куча, или сегмент данных. А данные размещаемые в контейнере -- ровно наоборот. std::vector с аллокатором по-умолчанию как раз использует кучу. А std::array размещает данные в самом контейнере, но там размер фиксированный, не добавить ничего, ни убавить.

Вот именно. Если бы, как утверждает автор, просто заменили нативный array на вектор, тогда строку:

buffer = new TCHAR[size];

заменили бы на:

buffer = new std::vector<TCHAR>(size);

- то была бы такая же утечка памяти. Но был заменен поинтер на объект в куче на атоматический объект на стеке. Понятно, что вектор по умолчанию размещает собственно данные в куче, но сам управляющий объект был размещен на стеке, что и обусловило автоматическое удаление объекта (деструктор) и возвращение в кучу сегмента данных.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий