Переопределение “нового” и Регистрация данных о вызывающей стороне

Лучший подход, по моему скромному мнению, должен был бы избежать специального теста. Большинство раз использование генератора тест:

thing_generated = False

# Nothing is lost here. if nothing is generated, 
# the for block is not executed. Often, that's the only check
# you need to do. This can be done in the course of doing
# the work you wanted to do anyway on the generated output.
for thing in my_generator():
    thing_generated = True
    do_work(thing)

, Если это не достаточно хорошо, можно все еще выполнить явный тест. На данном этапе thing будет содержать последнее сгенерированное значение. Если ничто не было сгенерировано, это будет не определено - если Вы уже не определили переменную. Вы могли проверить значение thing, но это немного ненадежно. Вместо этого просто установите флаг в блоке и проверьте его позже:

if not thing_generated:
    print "Avast, ye scurvy dog!"
5
задан Gayan 8 September 2009 в 17:24
поделиться

2 ответа

Вы можете написать

new(foo, bar) MyClass;

В этом случае вызывается следующая функция

void*operator new(std::size_t, Foo, Bar){
    ...
}

. Теперь вы можете вызвать

new(__LINE__, __FILE__) MyClass;

и использовать данные с помощью

void*operator new(std::size_t, unsigned line, const char*file){
    ...
}

. Добавление макроса

#define new new(__LINE__, __FILE__)

в отслеживаемый код перехватит большинство вызовов без необходимости изменения исходного кода.

Это не идеально, например, вы могли бы вызвать оператора new напрямую. В этом случае препроцессор превратит ваш код в мусор. Но я не знаю лучшего способа.

4
ответ дан 15 December 2019 в 01:06
поделиться

Нет, вы не можете сделать

#define new new(__FILE__, __LINE__)

, но можете:

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

посмотрите на: http://sourceforge.net/projects/nvwa/

0
ответ дан 15 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: