Способ, которым записано EV
, будет генерировать новый объект при каждом вызове.Но это создание не обязательно должно относиться к объекту того же типа, что и в конечном итоге передаваемый SendEvent.Это связано с тем, что текстовая природа макросов препроцессора и более сложные выражения добавляет некоторые хитрости.Подумайте об этом:
class dummy {
private:
static dummy* freeme;
public:
dummy() { freeme = this; }
static bool dofree() { delete freeme; return true; }
};
dummy* dummy::freeme;
CEvent *ev = new CEvent(this);
EV( dummy && dummy::dofree() ? ev : NULL );
Это расширится так, что вы запускаете не CEvent, а фиктивный класс ... который вы затем освобождаете, а затем все выражение оценивается какваше событие:
SendEvent( new dummy && dummy::dofree() ? ev : NULL );
(Примечание: использование?: не так хорошо, как оператор запятой, поэтому здесь есть пустая ветвь NULL, которая на самом деле никогда не происходит. Оператор запятой был бы хорош, ноМакросы препроцессора обрабатывают запятые особенно, и это один из случаев, когда его нельзя использовать. Делать его потокобезопасным оставлено в качестве упражнения для читателя.)
Чтобы сделать его "чище"но все же выразить это в терминах EV
... без явного упоминания SendEvent
, вы можете создать свой собственный макрос:
#define EV2(event) EV( dummy && dummy::dofree() ? event : NULL )
... или вы можете просто использовать SendEvent, так как он кажетсяделать именно то, что вы хотите.Но где в этом веселье?; -P
ОБНОВЛЕНИЕ:
Как указывает @AlfPSteinbach, более эзотерический, но легкий способ превратить ваш new
в неактивный - с размещением new:
int dummy;
CEvent *ev = new CEvent(this);
EV( (&dummy) int ? ev : NULL );
Итак, вы расширяетесь до:
SendEvent( new (&dummy) int ? ev : NULL );
Вы запускаете новое, но на этот раз не нужно беспокоиться о том, чтобы освободить результат!Потому что я не был полностью уверен, был ли это кошерный ESP.в случаях с многопоточностью я задал свой собственный вопрос:
Хорошо ли он определен / законен для размещения новых несколько раз по одному и тому же адресу?