A C++ objektumok az alábbi módon jöhetnek létre: - globális, névtérbeli változó vagy statikus adattag C - program eleje D - program vége - automatikus objektum (névvel rendelkezik) C - deklaráció kiértékelődik D - vezérlés elhagyja a deklaráló blokkot - dinamikus objektum (szabad memória, free store) C - new D - delete - nemstatikus adattag C - tartalmazó objektum létrejön D - tartalmazó objektum megsemmisül - tömbelem C - tömb létrejön D - tömb megsemmisül - lokális statikus objektum C - deklaráció első alkalommal kiértékelődik D - program vége - temporális objektum C - (rész)kifejezés kiértékelése D - teljes kifejezés kiértékelése után - union tag nem lehet statikus adattag nem lehet konstruktora ill. destruktora // automatikus élettartam void f() { int i = 2; // initializáció: i .... } // megsemmisül: i // statikus élettartam date d(2003,3,13); // inicializáció: d static int i; // inicializáció: i int main() { while ( ... ) { if ( ... ) { static int j = 6; // inicializáció: j } } } // megsemmisülés: j, i, d // dinamikus élettartam: date *p = new date; date *q = new date(*p); date *s = new date[10]; //... delete p; delete p; // !! runtime error delete s; // !! runtime error delete [] s;// ez a helyes // C-ben: date *p = (date*) malloc(sizeof(date)); //... free(p); // Temporális objektumok - Egy részkifejezés kiértékelésekor keletkezik - A teljes kifejezés kiértékelése után semmisül meg void f( string &s1, string &s2, string &s3) { const char *cs = (s1+s2).c_str(); cout << cs; // Bad!! if ( strlen(cs = (s2+s3).c_str()) < 8 && cs[0] == 'a' ) // Ok cout << cs; // Bad!! } // the correct way: void f( string &s1, string &s2, string &s3) { cout << s1 + s2; string s = s2 + s3; if ( s.length() < 8 && s[0] == 'a' ) cout << s; } // another correct way: void f( string &s1, string &s2, string &s3) { cout << s1 + s2; const string &s = s2 + s3; if ( s.length() < 8 && s[0] == 'a' ) cout << s; // Ok } // s1+s2 destroyes here: when the const ref goes out of scope