Допустимый вызов конструктора при управлении памятью

#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: Все возможно, если вы приложите к этому свой разум. Это не делает его законным.