@NastyaG

Особености функций malloc/calloc/new?

Здравствуйте. Не могу понять задание. Нужно показать, что некоторые функции из malloc/calloc/new выделения памяти не очищают данные для использования. Не могу понять, как это можно сделать . Вот например, функция malloc возвращает указатель . Как можно что-то сделать с ним, чтобы проверить утверждение выше?
Подскажите, пожалуйста , что можно сделать? Или хотя бы натолкните на мысль, пожалуйста
  • Вопрос задан
  • 505 просмотров
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
А вы документации не доверяете что ли?
Забивает память нулями только calloc, о чем в доке написано.
Проверено неоднократно.
Чтоб проверить выделите массив intов, например побольше - несколько мегабайт, и ищите в нем не нулевые значения. Уверен, долго искать не придется.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
UPD2. Что значит «очищают данные»?

а) Очищают данные = освобождают память. Сделать функцию, которая выделяет память в локальную переменную (и эта переменная, была бы уничтожена мусорщиком Java, вместе с выделенным массивом).

1. Выяснить, сколько памяти свободно.
2. Вызвать функцию.
3. Выяснить ещё раз, сколько памяти свободно.
4. Подождать пару секунд («мусорщик» точно сработал бы).
5. Выяснить третий раз, сколько памяти свободно.
Поскольку в C++ мусорщика нет, должно быть 1 > 3 = 5.

Узнать кол-во памяти — дело непортабельное, на Windows и Linux свои функции, см. stackoverflow.com/questions/2513505/how-to-get-ava...

UPD1. На Windows лучше использовать GetProcessMemoryInfo. В таком случае надо смотреть, сколько памяти программа съедает, и тогда 1 < 3 = 5. Поскольку внутренний менеджер памяти на своём уровне «закрысивает» немного памяти, лучше выделять много памяти, порядка мегабайта.

б) Очищают данные = забивают их нулями (наверно, всё-таки это). Выделить буфер подлиннее (или кучу буферов по одному int) и убедиться, что там не нули. Желательно компилировать программу на разных настройках — например, в Debug программа может забивать данные нулями или чем-то вроде DEADBEEF, а в Release — выдавать мусор.
Ответ написан
@NastyaG Автор вопроса
unsigned long long getTotalSystemMemory()
{
MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&memInfo);
return memInfo.ullAvailVirtual;
}
void funcMalloc(){
//выделяем память
int *t1;
t1=(int*)malloc(sizeof(int));
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
cout<<"Количество свободной оперативной памяти:"<
Ответ написан
Ваш ответ на вопрос

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

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