- 1
assert(this!=NULL);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+72.3
assert(this!=NULL);
Что-то мне подсказывает, что в правильно организованных проектах такого нет. Найдено во всех методах некоторых "избранных" объектах и частенько срабатывают. :)
Я не говорю, что это круто и правильно, скорее всего что-то в этом проекте ужасно нетак, но это по крайней мере объясняет срабатывание ассерта...
http://en.wikipedia.org/wiki/This_(computer_science)#C.2B.2B
Это особенно актуально, когда ты вызываешь метод класса через указатель на него. Есть методы, которые допускают такую семантику. Пример см. в ссылке.
С другой стороны, с помощью нехитрых манипуляций, можно вызвать _не_статический метод (в котором this определен) в "статическом контексте" - т.е. без передачи методу валидного указателя на объект.
Вообще говоря, это не приветствуется, и не факт что это поддерживается большинством компиляторов, но факт в том, что в некоторых фреймворках эту фичу используют - метод может быть вызван в статическом контексте и как метод экземпляра класса.
Что касается, данного поста, то код по-видимому знает, что его будут вызывать через указатель и поэтому проверяет, что вызов корректен - и ему передан валидный объект (адрес).
static stat_f(Class * cl)
{
cl->stat()
}
?
Или я опять ниче не понял. Можно примерчег?
public:
int metod(int arg)
{
return arg*2;
}
};
...
cout << ((Class*)0)->metod(2); //будет работать, пока metod не перепишут.
*((void*)1)=(*((void*)0));
asm ("int 3;");
А говнокод там, где создаётся объект по адресу 0.
if (!<указатель>) return.
Во-вторых, даже если ситуация this==NULL предусмотрена архитектурой, то это х#ёвая архитектура, провоцирующая ошибки.
Во-вторых, ошибками могут быть другие циферки, ага?
Какие двугие циферки? this==1? Мусор в указателях - это вообще звиздец, ни разу такого не случалось.
А вот это
>это стандартная ситуация. Например, конец связного массива
ты про что писал?
if (!<указатель>) return.
fixed. Долбаный xneur...
Пользуюсь отладчиком раз на 4к строк.
You shouldn't make mistakes anyway, it is a waste of time. We
don't want to hear anything about debuggers, we're not interested.
See figure 1.
assert(this!=NULL);
Где С++?
Я у себя так ошибку искал. Указатель на объект умирал (из-за ошибки в логике, код многопоточный, высокие требования к скорости, проблемы синхронизации, такой гемор), и проходил вызов метода уже убитого объекта. Что плохо: очень ИНОГДА (когда в момент вызова одного метода, одновременно вызывался другой, убивающий себя). Я ставил такие ассерты. Что делать...
Я у себя искал ошибку именно таким ассертом (и в нем он срабатывал). Вы можете утверждать что мой код плохой?
Внимательнее читай.
"ситуация this==NULL предусмотрена архитектурой" и assert(this) - это противоположные вещи. assert(this) - это параноидально, но правильно. А вот "if(!this)return;" - это всё, куку, досвидос.
Ну это-же говногод.ру, а не доброкот.ру :3
Сейчас пришлю весь проект. Ждите. ))))