@Sasha_88

Когда вызывается malloc() или new, то на самом деле вызывается какая-то win api функция?

И при удалении тоже? И вот интересно, а как сделать маленькую кучу, чтобы память выделялась в пределах этой маленькой кучи только?
  • Вопрос задан
  • 486 просмотров
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C++
Когда вызывается malloc() или new, то на самом деле вызывается какая-то win api функция?

Нет, не всегда. В большинстве случаев не вызывается. Системный вызов осуществляется только если текущий блок, управляемый сишной кучей (т.е. сишным рантаймом) исчерпывается. Если б каждый раз делался системный вызов, вы б не дождались результатов работы вашей программы.

И при удалении тоже?

См. выше.

И вот интересно, а как сделать маленькую кучу, чтобы память выделялась в пределах этой маленькой кучи только?

Выделяете блок памяти любым из известных вам способов, декларируете функции а-ля myalloc и myfree, и реализуете один из алгоритмов управления свободным пространством в куче (например, двоичного разбиения).

В C++ можно переопределить операторы new и delete.
Ответ написан
@abcd0x00
Первый раз вызывается какая-то функция операционной системы (в зависимости от системы, есть же не только Windows) и запрашивается очень большой блок (даже если запрашиваешь мало). Потом из него выделяется то, что ты запросил, и в нём же запоминается информация об этом (метаданные). При последующих вызовах этот первый блок продолжает нарезаться, пока в нём хватает памяти (может на всё время хватить). Во время освобождения памяти этот блок остаётся занятым, просто в нём какие-то места помечаются свободными для повторного использования.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы