TGViewer
Библиотека С# С++ Библиотека С# С++ @cpluscsharp · 10.1K subscribers
Post #589 749
🖥 C++: объект уничтожен, а 16 МиБ всё ещё заняты

std::weak_ptr может удерживать память даже при expired() == true.

Причина в std::make_shared: обычно он размещает объект и управляющий блок в одной аллокации.

В примере на скриншоте массив на 16 МиБ находится прямо внутри Blob. После удаления последнего shared_ptr:

* деструктор объекта вызывается;
* expired() возвращает true;
* общий блок памяти остаётся выделенным, пока существует хотя бы один weak_ptr.

После сброса последней слабой ссылки блок можно освободить.

Что делать: удалять протухшие ссылки из долгоживущих кешей. Для крупных объектов также можно рассмотреть отдельную аллокацию через std::shared_ptr<Blob>(new Blob()).

Нюанс касается размера самого объекта. Если данные хранятся в обычном std::vector, его отдельный буфер освобождается при вызове деструктора.

[Разбор от Microsoft](https://devblogs.microsoft.com/oldnewthing/20230815-00/?p=108602)
  • 👍 2
  • ❤ 1
More from @cpluscsharp
  1. Sep 14, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 15 сентября(уже завтра!) в 1…
  2. Sep 13, 2026💡 C++: std::map<std::string, ...> не обязан создавать временный std::string при каждом по…
  3. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  4. Sep 2, 2026C++26 получил новый контейнер `std::hive` - что-то между `std::vector` и `std::list`. Глав…
  5. Aug 23, 2026Бесплатная книга, после которой компиляторы перестают казаться магией По ходу книги вы соб…
  6. Aug 23, 2026🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку Окружение решает больше, чем кажет…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →