Я переопределяю глобальные новые/удаленные операторы C++ в проекте Linux. Все это прекрасно работает в моем собственном коде, пока я не узнал, что новые/удаленные символы в системных библиотеках также заменяются моим кодом! Это очень плохая проблема, поскольку она выходит за пределы «уровня зла», который я намеревался.C++ настраиваемые глобальные новые/удаленные системные библиотеки
Вопрос в том, как я могу помешать компоновщику/компилятору заменить новые/удалить syms из других (системных) разделяемых библиотек? Или, точнее, как я могу контролировать, какие общие библиотеки связывают сим в моей библиотеке? Я бы хотел, чтобы системные библиотеки все равно использовали свою стандартную реализацию new/delete. Особенно, когда исполняемый файл загружает другие дополнительные динамические библиотеки с помощью dlopen(), которые не под моим контролем.
Пользовательская глобальная реализация нового/удаления оператора встроена в общую библиотеку.
Я искал по всему Интернету, как управлять динамической связью, но не удалось. Сначала я пытаюсь изменить порядок ссылок библиотеки на тестовый исполняемый файл, но ничего не изменил.
Вы используете неправильную точку настройки. Замена глобальных операторов полезна, если вы действительно хотите сделать это изменение повсюду. Если вы хотите настроить распределение в локализованной библиотеке, вы должны использовать какой-либо другой механизм (например, распределители) для предоставления точки настройки. –
Учитывайте перегрузку новых и удаленных операторов только на своих классах. Если у вас есть базовый класс для большинства ваших объектов, сделайте это там. Это должно охватывать большую часть используемой памяти. Затем вы можете попробовать создать пользовательские распределители STL в тех случаях, когда вам нужно управлять своими объектами внутри контейнеров STL. –
Перегрузка нового/удаляемого только в общем классе «root» не помогла бы мне в ситуациях, таких как простая функция выделения необработанной памяти. Рефакторинг большого количества кода для использования пользовательской базы new/delete будет утомительным. Я просматриваю возможность LD_PRELOAD распределителя, чтобы проверить его на других программах на C++. – JATothrim