В большинстве операционных систем и большинства версий компилятора при запуске вашей программы некоторый объем памяти выделяется для использования для new
и других динамических распределений. Реализация диспетчера памяти разделяет какую-то память и создает некоторые структуры данных, чтобы можно было легко обслуживать запросы. Когда вы запрашиваете память, если есть блок, достаточно большой для хранения вашего запроса, диспетчер памяти передает это блок назад, а когда вы освобождаете что-то, он возвращает его в пул для будущего рассмотрения.
Если вы делаете запрос и нет свободного места, существует несколько стратегий, которые может использовать менеджер памяти. В некоторых системах для очень больших распределений менеджер памяти будет использовать только mmap
и вернуть ОС блок памяти. В других случаях он будет использовать системный вызов, например sbrk
, чтобы получить больше памяти от ОС, а затем вырезать то же самое, что и существующая память.
Если вы пропустите память в своей программе, менеджер памяти вашей программы никогда не будет перерабатывать эту память, и она будет недоступна вашей программе, если ваша программа запущена. Если ваша программа никогда не нуждается в этой памяти, это совершенно нормально - она может перерабатывать ранее освобожденные блоки, но если ей требуется больше памяти, она будет больше требовать к ОС.
Все современные операционные системы автоматически возвращают всю память, выделенную процессом, когда этот процесс завершается, поэтому, как только любой процесс завершает работу, вся освобожденная память освобождается. Запрещая жестокую и необычную операционную систему, программа, которая утечки тонны памяти никогда не будет постоянно запрещать другим программам использовать эту память.
Что-то иметь в виду, что вся память, вы работаете с вашей программой является виртуальной памяти и не физической памяти. Каждая программа считает, что она полностью использует всю системную память, но на самом деле ОС все время перемещает память или выгружает все на диск по мере необходимости. В этом смысле, даже если ваша программа задала ОС для всей памяти в системе, это не помешало бы другим программам работать также - это просто заставило бы процесс замедляться, как сумасшедший, как память, в которой он думает, что он продолжает получать постраничный вход и выход.
Что вы имеете в виду под назначением и переназначением? Может ли это сделать в коде? В общем, возможность получить данные, которые находятся в, казалось бы, освобожденной памяти, довольно высока. – MikeMB
Для аргумента предположим, что он назначен новым, с заданной длиной, с помощью указателя, а затем переназначается на том же указателе того же размера. – bigcodeszzer
У меня нет C++ на моем текущем компьютере, или я бы предоставил код. – bigcodeszzer