#c #memory #memory-management #malloc #new-operator
#c #память #управление памятью #malloc #new-оператор
Вопрос:
Я написал собственную библиотеку памяти, которая помогает мне избежать утечек памяти и избежать проблем с фрагментацией. Все работает нормально. Основная проблема в том, что он не работает корректно с классами. Когда я вызываю my_alloc (size), я хочу автоматически вызвать конструктор, если он существует. Могу ли я сделать это без перегрузки new operator?
Комментарии:
1. Это зависит — вам нужно будет опубликовать больше вашего API.
2. Я подозреваю, что ваша собственная библиотека памяти на самом деле не улучшает реализацию malloc, предоставляемую вашей ОС.
3. @DeadMG: Это своего рода линейный распределитель. Если не вдаваться в подробности, это похоже на это: void *memory_pool = malloc(10000); void *my_alloc(size) { возвращает first_free_section_in_memory_pool; }
4. И я подозреваю, что это скрывает утечки памяти, а не позволяет их избежать.
5. Стандартный диспетчер памяти разрабатывается более двух десятилетий, и он довольно хорош. Маловероятно, что вы сможете улучшить его без эквивалентного объема работы (т. Е. вы уже отстали на 30 человеко-лет).
Ответ №1:
Вы можете использовать размещение new в выделенной памяти, чтобы вызвать конструктор, не разрешая new
выполнять выделения.
Что не так с перегрузкой new
?
Комментарии:
1. Спасибо! Именно то, что мне нужно. Перегрузка new не является неправильной, но у меня есть некоторые подробности, почему я не могу этого сделать. Одна из них заключается в том, что я использую несколько «модулей памяти» одновременно из-за специфики моего приложения. Поэтому мне всегда нужно передавать «ctx» в качестве параметра при вызове my_alloc(ctx, size). Вот почему я не могу просто перегрузить «new».
2. @Oleg : Неверное предположение; при перегрузке
new
вы можете добавить дополнительные аргументы. Итак, вы бы вызвалиT* ptr = new(ctx) T(ctorArgs);
Ответ №2:
Проверьте свою реализацию на C . Некоторые из них (я думаю, что это делает компилятор G ) вызывают среду выполнения C malloc
, чтобы получить память для new
, затем вызывают конструкторы.
Если у вас есть одна из этих реализаций, все, что вам нужно сделать, это правильно переопределить стандартные библиотечные функции malloc и free (прочитайте документацию по внутренним компонентам библиотеки), и C заработает автоматически.
Комментарии:
1. Не существует законного способа переопределить malloc / free
2. @Martin: Многие библиотеки предлагают перехваты, специально разработанные для того, чтобы разрешить переопределение malloc и free.
3. @Martin: glibc предлагает __malloc_hook, __realloc_hook, __free_hook и т.д.
4. @Martin: Я также считаю, что функции glibc определены как слабые, что позволяет переопределять их любой другой функцией с тем же именем. Это позволяет вам загрузить собственную библиотеку malloc.
5. @Zan Lynx: Все возможно, если вы приложите к этому свой разум. Это не делает его законным.