C ++, обходной путь для макроса, использующего this в статических функциях-членах - PullRequest
2 голосов
/ 20 сентября 2010

Я переопределил новый, чтобы я мог отслеживать распределение памяти. Дополнительные параметры, такие как __FILE__, __LINE__, имя модуля и т. Д., Добавляются в #define.

Однако я хочу добавить адрес вызывающего объекта к параметрам, чтобы я мог отследить распределение при поиске проблем. Самый простой способ - добавить «this» к этим дополнительным параметрам (что означает, что адрес вызывающей стороны передается в мои пользовательские ресурсы alloc).

К сожалению, в нашем коде много синглетонов, что означает набор статических функций-членов, вызывающих new. Компилятор выдает ошибку C2671: '...' : static member functions do not have 'this' pointers

Есть ли обходной путь, при котором я могу получить адрес объекта без использования this, который также понял бы, что это статический метод, и передал бы null скажем?

Или, может быть, мой #define new распознает статический метод и переключится на другое определение?

Важно, чтобы я не влиял на существующий код проекта - я не хочу заставлять разработчиков использовать собственный метод, такой как staticnew, только потому, что он в статическом методе - они должны продолжать использовать новый, как обычно, все отслеживание памяти происходит в фоновом режиме ...

Ответы [ 2 ]

5 голосов
/ 20 сентября 2010

Вы определенно не можете определить, находится ли макрос #define внутри статического метода или нет.Вы даже не должны использовать #define new, поскольку это нарушает стандарт (даже если все компиляторы поддерживают его).Ваш макрос также доставит неприятности тем, кто хочет перегрузить оператор, новый для своего класса.Как правило, я бы предложил не использовать этот вид отладки памяти.Есть много зрелых отладчиков памяти, которые работают лучше при отладке ошибок памяти.Самый известный из них - Вальгринд.Чтобы дать простой ответ на ваш вопрос - не существует чистого решения в том, как вы подходите к проблеме.

0 голосов
/ 20 сентября 2010

Ну, как только вы идете по пути "взлома", вы можете выбросить переносимость в окно и приблизиться к компилятору.

Вы можете поместить в свой макрос какой-нибудь встроенный ассемблер, который вызывает функциюс указателем на строку, сгенерированную __FUNCDNAME__, и если она выглядит как функция-член, получите указатель this в ассемблере, а если нет, просто используйте null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...