crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вызов пользовательских функций вместо служебных слов 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  


Цитата(Iron Bug @ 19.11.2011, 16:04) *
перегрузка должна сработать, только линковать надо вручную: сначала библиоткеку с перегрузкой, а потом, отдельно - свою часть с нормальной библиотекой.
либо перегружать всё, а в своих методах поставить какой-нить 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 10.5.2024, 21:44