Výjimka a destruktory

asd

Výjimka a destruktory
« kdy: 07. 03. 2012, 13:30:03 »
Zdravim,

uvazujme nasledujuci kod:

Kód: [Vybrat]
#include <iostream>
#include <exception>

using namespace std;

class fooException : public exception
{
    public:
        const char * what() const throw()
        {
            return 0;
        }
       
        ~fooException() throw() {}
};

class options
{
    public:
        options(int argc, char ** argv)
        {
        printVersion();
        }

        void printVersion()
        {
            cout << "1.0.0\n";
            throw fooException();
        }
};

class foo
{
    private:
        options * m_options;

    public:
        foo(int argc, char ** argv)
        {
            // ...
            m_options = new options(argc, argv);
            // ...
        }

        ~foo()
        {
            delete m_options;
        }
};


int main(int argc, char ** argv)
{
    try
    {
        foo f(argc, argv);
    } catch (fooException & e) {}

    return 0;
}

v skratke mam 2 triedy - prva je "hlavna", druha je ta ktora spracuvava agrumenty z terminalu. V hlavnej triede pouzivam na vytvorenie objektu triedy options operator new tj. v destruktore tu alokovanu pamat musim uvolnit. Ak by uzivatel zadal napr nieco taketo:

Kód: [Vybrat]
$ ./foo -v
tak by mal dostat takyto vystup:

Kód: [Vybrat]
1.0.0

s tym, ze program hned po vypisani verzie zacne "backtrace-ovat", zavola destruktory oboch tried a ukonci sa. Je taketo riesenie pomocou vynimky spravne alebo odporucate nieco ine?

Diky
« Poslední změna: 07. 03. 2012, 14:05:05 od Petr Krčmář »


Sten

Re:Výjimka a destruktory
« Odpověď #1 kdy: 07. 03. 2012, 14:57:29 »
Protože se nedokončí konstruktor, nevolá se destruktor, ale na druhou stranu se nedokončí new, a tak se ten objekt stejně odstraní.

Ale stejně bych vám doporučil použít chytré ukazatele.