- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
#include <iostream>
using namespace std;
class Class {
public:
explicit Class(int a) : m_int(a) {}
int get() const { return m_int; }
void swapThis(int a) {
delete this;
Class **thisptr = reinterpret_cast<Class**>(&a);
thisptr--;
*thisptr = new Class(a);
cout << "this: " << this << endl
<< "that: " << *thisptr << endl;
}
private:
int m_int;
};
int main() {
Class *s = new Class(13);
s->swapThis(42);
cout << s->get() << endl;
delete s;
return 0;
}
Автор рисковый парень ;)
http://ideone.com/WY9qdS
Самый черезжопный способ получения this, я долго втыкал. Школолокулхацкерство как оно есть.
Ага. Вообще не факт, что он находится в памяти. Мало того, что компилятор имеет право передать this в регистре, так он еще и заинлайнить swapThis может, и никакой передачи вообще не будет...
или на диске в свопе
И код становится машиннозависимым
вобщем что я хочу сказать: меня ГКды, специально писаные для ГК, утомляют еще больше чем школьные ГК. по крайней мере в последних есть эта наивная искренная неопытность и детское упрямство.
А синтетика да, не веселит.
Ну почему, попадается иногда веселая синтетика. Мне например этот код понравился настойчивыми попытками обмануть компилятор, и подсунуть ему другой this.