kfyatek.jogger.pl

Retrotechnologiczne ciekawostki - this w C++

08 lutego 2010, 05:34:14 | Komputery | Techblog
class SomeClass {
public:
  SomeClass() {
    this = someFancyMalloc();
    // initialization
  }
  ~SomeClass() {
    // deinitialization
    this = NULL;
  }
};

Tak kiedyś w C++ można było przejąć kontrolę nad (de)alokowaniem obiektów. Przypisanie pod this w konstruktorze oznaczało, że obiekt zostanie zainicjzowany pod wskazanym adresem, a przypisanie zera pod this w destruktorze powodowało, że nie zostanie wywołana dealokacja.

Tak się to robiło, kiedy nie było placement new, ani przeciążania new/delete. Jeśli kompilator znalazł w ciele konstruktora przypisanie pod this, nie alokował pamięci, this na początku było NULLem, i trzeba było się o to zatroszczyć samemu. Można też w kodach spotkać się z ifem sprawdzającym czy this jest nullem - nie będzie przy tworzeniu tablicy, czy choćby zwykłej alokacji na stosie.

Ten osobliwy idiom otrzymał jednak mniej lub bardziej oficjalnie status deprecated już w roku 1989, wraz z drugim wydaniem kompilatora Cfront, w którym dodano placement new, oraz przeciążanie new/delete. Pod koniec lat dziewięćdziesiątych kompilatory przestały w ogóle pozwalać na jego używanie.


Wcześniejsze wpisy →