который, похоже, имеет семантику, аналогичную
то может быть третий раз, когда вы видите этот код, потому что я задал два других вопроса об этом (это а такжеэто) .. код довольно прост:
#include <vector>
int main() {
std::vector<int> v;
}
Затем я собираю и запускаю его с Valgrind для Linux:
g++ test.cc && valgrind ./a.out
==8511== Memcheck, a memory error detector
...
==8511== HEAP SUMMARY:
==8511== in use at exit: 72,704 bytes in 1 blocks
==8511== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==8511==
==8511== LEAK SUMMARY:
==8511== definitely lost: 0 bytes in 0 blocks
==8511== indirectly lost: 0 bytes in 0 blocks
==8511== possibly lost: 0 bytes in 0 blocks
==8511== still reachable: 72,704 bytes in 1 blocks
==8511== suppressed: 0 bytes in 0 blocks
...
==8511== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Здесь Valgrind сообщает, что утечки памяти нет, хотя есть 1 alloc и 0 free.
ОтветВот указывает, что распределитель, используемый стандартной библиотекой C ++, не обязательно возвращает память обратно в ОС - он может хранить их во внутреннем кэше.
Вопрос:
1) Зачем хранить их во внутреннем кэше? Если это для скорости,как это быстрее? Да, ОС должна поддерживать структуру данных, чтобы отслеживать распределение памяти, но это также необходимо делать и сопровождающему этого кэша.
2) Как это реализовано? Потому что моя программаa.out
уже завершается, нет другого процесса, который поддерживает этот кэш памяти - или есть?
Изменить: для вопроса (2) - Некоторые ответы, которые я видел, предлагают «C ++ runtime», что это значит? Если «C ++ runtime» - это библиотека C ++, но библиотека - это просто набор машинного кода, который находится на диске, это не запущенный процесс - машинный код либо связан с моимa.out
(статическая библиотека,.a
) или вызывается во время выполнения (общие объекты,.so
) в процессеa.out
.