Realloc и calloc вызывают malloc? - PullRequest
5 голосов
/ 14 июля 2011

Вероятно, это простой вопрос, но я не смог найти ответ. Вызывается ли внутри malloc внутри realloc и внутри calloc? Так как я как-то подсчитываю вызовы malloc, мне это интересно. Спасибо

Ответы [ 4 ]

6 голосов
/ 14 июля 2011

Вы не должны пытаться зависеть от механизмов, зависящих от системы, библиотеки или компилятора.Даже если вы знаете, что realloc вызывает malloc в одной системе / компиляторе / библиотеке, вы не можете быть уверены, что он будет обрабатываться аналогично в других системах.

В этот момент возникает вопрос: что вы пытаетесь сделать?достичь.Если вам нужно отслеживать использование памяти, в C ++ есть более эффективные способы, например, установка глобальной замены для операторов new и delete.В некоторых версиях Linux вы также можете добавить хуки для malloc (хотя эта функция никогда не использовалась).В других системах вы можете использовать другие механизмы для достижения того, что вам нужно более безопасно.

2 голосов
/ 14 июля 2011

Поскольку вы работаете в Linux, вы, вероятно, используете glibc. Вы можете посмотреть на исходный код glibc malloc и увидеть, что он вызывает что-то, называемое __malloc_hook, из таких функций, как calloc. Это документированная функция, которую вы можете использовать для перехвата и подсчета выделений. Вы можете получить другую полезную статистику из mallinfo . Но посмотрите, есть ли существующий инструмент, который в первую очередь достигает того, чего вы хотите. Отладка и статистика по управлению памятью - обычное требование!

1 голос
/ 14 июля 2011

Вы можете написать простую тестовую программу, которая вызывает realloc и calloc и передает ее в callgrind (один из инструментов Valgrind).Он покажет график вызовов, чтобы вы могли проверить, какие функции вызываются malloc и calloc в вашей реализации libc.

0 голосов
/ 14 июля 2011

Мы не знаем из стандартов языков. C99 ничего не говорит о функциях, вызывающих друг друга, или нет.

C ++ только говорит, что malloc не может вызвать new, но не имеет других подобных ограничений ни для одной функции.

...