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