@NastyaG

С++ как проверить, что функции delete,free не заботятся о физической очистке памяти после удаления?

Здравствуйте. Подскажите, пожалуйста, как можно проверить, что что функции delete,free не заботятся о физической очистке памяти после удаления? Я понимаю это так: нужно выделить память, проверить количество свободной физической памяти, удалить переменные, и снова проверить память.
Вот мой код:

void getPhysicalMemory(){
		MEMORYSTATUSEX statex;
        statex.dwLength = sizeof (statex);
        GlobalMemoryStatusEx (&statex);
        cout<<"\nAvailble  physical memory:"<<statex.ullAvailPhys<<endl;
}
void test(){
	int *a = new int; 
    int *b = new int(5);
    *a = 10;
    *b = *a + *b;
    cout << "b is " << *b << endl;

	getPhysicalMemory();
  
	delete a;
    delete b;

   getPhysicalMemory();
}


Но при запуске я получаю, что при первом выводе значение все-таки больше, то есть и физическая память также очищается
Правильно ли это?
  • Вопрос задан
  • 291 просмотр
Пригласить эксперта
Ответы на вопрос 3
15432
@15432
Системный программист ^_^
освобождение и очистка памяти вещи разные.
память освобождается (количество свободной памяти увеличивается), но данные в этой памяти не стираются.

например:
unsigned int * some_variable = (unsigned int*)malloc(sizeof(unsigned int));
*some_variable = 0xDEADBEEF;
free(some_variable);
if (*some_variable == 0xDEADBEEF)
{
    printf("memory was not erased after free!\n");
}
else
{
    printf("memory was erased OK! cur val: 0x%08X\n", *some_variable);
}
Ответ написан
Комментировать
Rou1997
@Rou1997
"Физическая очистка" - это обнуление всех байт, освобождение - это просто "сказать" ОС, что эти байты больше не будут использоваться процессом вашего приложения, и что можно выделять их для других процессов, вещи совсем разные, обнулять байты перед освобождением нужды нет.
Ответ написан
@res2001
Developer, ex-admin
Видимо вы имеете ввиду происходит ли фактическое освобождение памяти на уровне операционной системы при вызове delete и free?
Не обязательно. В стандартной библиотеке есть свой менеджер памяти интерфейсом к которому являются new/delete/malloc/free. У этого менеджера памяти какой-то свой алгоритм работы и он не обязательно при каждом вызове запрашивает/возвращает память ОС. На сколько я знаю в стандарте никак не регламентируется этот вопрос, поэтому поведение менеджера памяти - целиком на совести разработчика стандартной библиотеки для вашего компилятора.
Более того стандартный менеджер памяти можно заменить другим, они есть уже готовые. Можете написать свой собственный, такой как вам нужно.
Если вы хотите построить на поведении стандартного менеджера памяти какую-то логику приложения, то не стоит этого делать, т.к. в следующей версии вашего компилятора реализация менеджера памяти может быть другая.
Вообще не нужно приписывать дополнительный функционал стандартной библиотеке. Воспринимайте все что написано в стандарте буквально и ничего от себя не добавляйте.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы