2016-11-24 13 views
0

Мне интересно, как компилятор C++ взаимодействует с оборудованием с точки зрения распределения динамической памяти.Восстановление динамической памяти CPP

Например, когда исполняемый файл C++ запрашивает память из ОС, каким прямым доступом является этот доступ?

Если динамическая память назначена, а затем вручную переназначена, можно ли впоследствии восстановить потерянные данные? Возможно, в записях ОС или в результате присвоения памяти не переводится точно после интерпретации компилятором?

Возможно ли восстановить динамически назначенные данные?

+0

Что вы имеете в виду под назначением и переназначением? Может ли это сделать в коде? В общем, возможность получить данные, которые находятся в, казалось бы, освобожденной памяти, довольно высока. – MikeMB

+0

Для аргумента предположим, что он назначен новым, с заданной длиной, с помощью указателя, а затем переназначается на том же указателе того же размера. – bigcodeszzer

+0

У меня нет C++ на моем текущем компьютере, или я бы предоставил код. – bigcodeszzer

ответ

1

В большинстве операционных систем и большинства версий компилятора при запуске вашей программы некоторый объем памяти выделяется для использования для new и других динамических распределений. Реализация диспетчера памяти разделяет какую-то память и создает некоторые структуры данных, чтобы можно было легко обслуживать запросы. Когда вы запрашиваете память, если есть блок, достаточно большой для хранения вашего запроса, диспетчер памяти передает это блок назад, а когда вы освобождаете что-то, он возвращает его в пул для будущего рассмотрения.

Если вы делаете запрос и нет свободного места, существует несколько стратегий, которые может использовать менеджер памяти. В некоторых системах для очень больших распределений менеджер памяти будет использовать только mmap и вернуть ОС блок памяти. В других случаях он будет использовать системный вызов, например sbrk, чтобы получить больше памяти от ОС, а затем вырезать то же самое, что и существующая память.

Если вы пропустите память в своей программе, менеджер памяти вашей программы никогда не будет перерабатывать эту память, и она будет недоступна вашей программе, если ваша программа запущена. Если ваша программа никогда не нуждается в этой памяти, это совершенно нормально - она ​​может перерабатывать ранее освобожденные блоки, но если ей требуется больше памяти, она будет больше требовать к ОС.

Все современные операционные системы автоматически возвращают всю память, выделенную процессом, когда этот процесс завершается, поэтому, как только любой процесс завершает работу, вся освобожденная память освобождается. Запрещая жестокую и необычную операционную систему, программа, которая утечки тонны памяти никогда не будет постоянно запрещать другим программам использовать эту память.

Что-то иметь в виду, что вся память, вы работаете с вашей программой является виртуальной памяти и не физической памяти. Каждая программа считает, что она полностью использует всю системную память, но на самом деле ОС все время перемещает память или выгружает все на диск по мере необходимости. В этом смысле, даже если ваша программа задала ОС для всей памяти в системе, это не помешало бы другим программам работать также - это просто заставило бы процесс замедляться, как сумасшедший, как память, в которой он думает, что он продолжает получать постраничный вход и выход.

+0

Есть ли способ заставить ОС предоставить блок памяти точно в соответствии с запросом? Если это так, нужно ли это выполнить? Я сборка? – bigcodeszzer

+0

Или, более подходящим образом, заставить аппаратное обеспечение предоставить доступ, поскольку я полагаю, что ОС больше не задействована в этой точке. – bigcodeszzer

+0

Так что, если бы я хотел выделить/точные/адреса в чипе ОЗУ, который находится в машине. – bigcodeszzer