Вызов пользовательских функций вместо служебных слов new, delete |
Здравствуйте, гость ( Вход | Регистрация )
Вызов пользовательских функций вместо служебных слов new, delete |
Count0 |
19.11.2011, 15:46
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 30.7.2011 Пользователь №: 2772 Спасибо сказали: 0 раз(а) Репутация: 0 |
Добрый день. Существует ли возможность подменять вызовы служебных слов new и delete пользовательской функцией во всех функциях, объявленных в dll и вызванных из определенного класса?
Перегрузка операторов new(size_t) и delete(void*) не подходят, так как необходима работа с примитивными типами, а перегрузка глобальных операторов затронет и часть программы не связанную с dll (хотя глобальная перегрузка в рамках одного класса подойдет). Заранее благодарен. |
|
|
Iron Bug |
19.11.2011, 16:04
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
перегрузка должна сработать, только линковать надо вручную: сначала библиоткеку с перегрузкой, а потом, отдельно - свою часть с нормальной библиотекой.
либо перегружать всё, а в своих методах поставить какой-нить define и вызывать другие реализации. можно использовать namespace'ы. Сообщение отредактировал Iron Bug - 19.11.2011, 16:05 |
|
|
Count0 |
19.11.2011, 19:59
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 17 Регистрация: 30.7.2011 Пользователь №: 2772 Спасибо сказали: 0 раз(а) Репутация: 0 |
перегрузка должна сработать, только линковать надо вручную: сначала библиоткеку с перегрузкой, а потом, отдельно - свою часть с нормальной библиотекой. либо перегружать всё, а в своих методах поставить какой-нить define и вызывать другие реализации. можно использовать namespace'ы. С namespace не проходит оператор new(size_t) может быть определен только в глобальном пространстве имен или переопределен для конкретного класса Иначе ошибка: 'void* MemorySafe::operator new(size_t)' may not be declared within a namespace http://stackoverflow.com/questions/1568168/testoperator-new - аналогичный пример с объяснениями, вдруг кому-то пригодится. А можно ссылку на материал, поясняющий механизм линковки библиотек? |
|
|
Iron Bug |
19.11.2011, 23:24
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Тут теория и про ELF, и про PE:
http://www.iecc.com/linker/linker10.html Может, ещё вот это пригодится: http://www.symantec.com/connect/articles/d...indows-part-two http://www.cs.umd.edu/Library/TRs/CS-TR-4585/CS-TR-4585.pdf система, как я понимаю, венда? а то в вопросе система не указана, но судя по "dll" - венда. и ещё: сорцы исходной библиотеки имеются? если нет, то есть ли статический вариант этой библиотеки? в венде пространства имён загружаемых модулей разделены. теоретически, должно быть можно перегрузить одну из функций без особого геморроя. я предполагаю, что нужно сделать библиотеку с перегруженной функцией в пространстве std, с прилинкованной исходной, с включением зависимых библиотек(не помню на память эту опцию линкера, но она есть). а потом динамически линковать её к основному модулю. как-то так. но проверить не могу, ибо дома венды у меня нет. в линюксе это значительно сложнее. Сообщение отредактировал Iron Bug - 20.11.2011, 0:12 |
|
|
Текстовая версия | Сейчас: 29.11.2024, 7:21 |