Ничто так не ограничивает полёт мысли программиста, как компилятор :)) Но как сказал один мой товарищ - если иметь фантазию - можно творить чудеса... Сегодня мне в аську колега в комманде кинул интересный код вызова чисто виртуальной фукнции:
void func(class A*);
class A
{
public:
A() {func(this);}
virtual void pure() = 0;
};
class B : public A
{
public:
virtual void pure() {}
};
void func(A* a)
{
a->pure();
}
int main()
{
B* b = new B();
}
суббота, 16 мая 2009 г.
понедельник, 6 апреля 2009 г.
Думал, что мир перевернулся...
Сидел на лекции, баловался.. В итоге вышло, что заработал данный кусок кода (но только в релиз варианте, дебаг перехватывает обращения к неициализированному поинтеру):
class A {
public:
int a;
bool b;
float c;
void debug() { printf("%i %s %f\r\n", a, b ? "true" : "false", c); }
};
int main() {
A * f; // <-- ??? f->a = 4;
f->b = true;
f->c = 4.5f;
f->debug();
return 0;
}
Дальше в лес, больше дров, мой товарищ решил совсем извратиться :))
float* f;
int i;
for (i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Так работает, но после определенного числа итераций валится.
А след. кусок валится сразу (если int i обьявить в конструкции for).
float* f;
for (int i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Обьяснение приблизительно следующее: в релиз варианте поинтер забивается дефолтным мусором (принцип его формирования нам остался неизвестным), но если из этого мусора сделать поинтер, то он будет указывать на доступную область памяти, в эту память можно писать. Так как нам все же доступно не все адресное пространство - то на определенном числе итерации оно валится..
class A {
public:
int a;
bool b;
float c;
void debug() { printf("%i %s %f\r\n", a, b ? "true" : "false", c); }
};
int main() {
A * f; // <-- ??? f->a = 4;
f->b = true;
f->c = 4.5f;
f->debug();
return 0;
}
Дальше в лес, больше дров, мой товарищ решил совсем извратиться :))
float* f;
int i;
for (i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Так работает, но после определенного числа итераций валится.
А след. кусок валится сразу (если int i обьявить в конструкции for).
float* f;
for (int i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Обьяснение приблизительно следующее: в релиз варианте поинтер забивается дефолтным мусором (принцип его формирования нам остался неизвестным), но если из этого мусора сделать поинтер, то он будет указывать на доступную область памяти, в эту память можно писать. Так как нам все же доступно не все адресное пространство - то на определенном числе итерации оно валится..
четверг, 5 марта 2009 г.
Кхм... Раз два раз два... Проверка микрофона.. Я в эфире?))
Hello world.
Вот и у меня любопытство взяло верх, решил поближе познакомиться с ЖЖ )) Посмотрим, что из этого выйдет ;)
Вот и у меня любопытство взяло верх, решил поближе познакомиться с ЖЖ )) Посмотрим, что из этого выйдет ;)
Подписаться на:
Сообщения (Atom)