malloc и получение недавно освобожденной памяти - PullRequest
1 голос
/ 24 мая 2010

Я выделяю массив и освобождаю его при каждом обратном вызове аудиопотока.Основной пользовательский поток (веб-браузер) постоянно выделяет и освобождает память на основе пользовательского ввода.Я отправляю неопубликованный массив float на звуковую карту.(пример на моей странице в моем профиле.) Идея состоит в том, чтобы услышать изменения состояния программы.

Когда я вызываю malloc(sizeof(float)*256*13) и меньше, я получаю массив, заполненный широким диапазоном чисел с плавающей точкой, которые имеют, казалось бы, случайное распределение,Неправильно называть это случайным - возможно, это происходит из-за того, что ранее было в блоке памяти.Это поведение, которое я ожидал и хочу использовать.Однако, когда я делаю malloc(sizeof(float)*256*14) и больше, я получаю массив, заполненный только нулями.Я хотел бы знать, почему существует этот утес и есть ли что-то, что я могу сделать, чтобы обойти это.Я знаю, что по стандарту это неопределенное поведение, но я надеюсь, что у кого-то, кто знает реализацию malloc в какой-либо системе, может быть объяснение.

Означает ли это, что malloc также устанавливает mem в ноль для больших размеров??Это было бы удивительно, так как это было бы неэффективно.Даже если будет обнулено больше фрагментов памяти, я ожидаю, что что-то случится иногда, так как массивы постоянно меняются.
Если возможно, я бы хотел получить фрагменты памяти, которые перераспределяются по недавно освобожденной памятипоэтому любые альтернативы будут приветствоваться.

Я думаю, это странный вопрос для некоторых, потому что моя цель - исследовать неопределенное поведение и сознательно использовать плохие методы программирования, но это приложение, которое мне интересно создавать, поэтому, пожалуйста, имейте в виду использование неинициализированных массивов.,Я знаю, что поведение такого использования не определено, поэтому, пожалуйста, потерпите меня и не говорите мне не делать этого.Я разрабатываю на Mac 10.5.

Ответы [ 2 ]

9 голосов
/ 24 мая 2010

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

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

1 голос
/ 24 мая 2010

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

...