который, похоже, имеет семантику, аналогичную

то может быть третий раз, когда вы видите этот код, потому что я задал два других вопроса об этом (это а такжеэто) .. код довольно прост:

#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.

Ответы на вопрос(0)

Ваш ответ на вопрос