Комментарии 3
Но выделенный буфер никогда не освобождается (из-за ошибки). Этого можно надёжно избежать, если использовать std::vector, который позаботится о выделении и освобождении внутрисистемно
Да нет же. Просто array был размещен в куче, с использованием new, а std::vector на стеке, с автоматическим удалением. Если бы std::vector создавался в куче, была бы та же самая проблема.
Любой контейнер сам по себе размещается в том контексте, где его создали, от самого контейнера не зависит, стек это, куча, или сегмент данных. А данные размещаемые в контейнере -- ровно наоборот. std::vector с аллокатором по-умолчанию как раз использует кучу. А std::array размещает данные в самом контейнере, но там размер фиксированный, не добавить ничего, ни убавить.
Вот именно. Если бы, как утверждает автор, просто заменили нативный array на вектор, тогда строку:
buffer = new TCHAR[size];
заменили бы на:
buffer = new std::vector<TCHAR>(size);
- то была бы такая же утечка памяти. Но был заменен поинтер на объект в куче на атоматический объект на стеке. Понятно, что вектор по умолчанию размещает собственно данные в куче, но сам управляющий объект был размещен на стеке, что и обусловило автоматическое удаление объекта (деструктор) и возвращение в кучу сегмента данных.
Исследование нескольких проблем, обнаруженных при статическом анализе