c++ - Is a destructor called when an object goes out of scope? -
for example:
int main() { foo *leedle = new foo(); return 0; } class foo { private: somepointer* bar; public: foo(); ~foo(); }; foo::~foo() { delete bar; } would destructor implicitly called compiler or there memory leak?
i'm new dynamic memory, if isn't usable test case, i'm sorry.
yes, automatic variables destroyed @ end of enclosing code block. keep reading.
your question title asks if destructor called when variable goes out of scope. presumably meant ask was:
will foo's destructor called @ end of main()?
given code provided, answer question no since foo object has dynamic storage duration, shall see shortly.
note here automatic variable is:
foo* leedle = new foo(); here, leedle automatic variable destroyed. leedle pointer. thing leedle points not have automatic storage duration, , not destroyed. so, if this:
void doit() { foo* leedle = new leedle; } you leak memory allocated new leedle.
you must delete has been allocated new:
void doit() { foo* leedle = new leedle; delete leedle; } this made simpler , more robust using smart pointers. in c++03:
void doit() { std::auto_ptr <foo> leedle (new foo); } or in c++11:
void doit() { std::unique_ptr <foo> leedle = std::make_unique <foo> (); } smart pointers used automatic variables, above, , when go out of scope , destroyed, automatically (in destructor) delete object being pointed to. in both cases above, there no memory leak.
let's try clear bit of language here. in c++, variables have storage duration. in c++03, there 3 storage durations:
1: automatic: variable automatic storage duration destroyed @ end of enclosing code block.
consider:
void foo() { bool b = true; { int n = 42; } // line 1 double d = 3.14; } // line 2 in example, variables have automatic storage duration. both b , d destroyed @ line 2. n destroyed @ line 1.
2: static: variable static storage duration allocated before program begins, , destroyed when program ends.
3: dynamic: variable dynamic storage duration allocated when allocate using dynamic memory allocation functions (eg, new) , destroyed when destroy using dynamic memory allocation functions (eg, delete).
in original example above:
void doit() { foo* leedle = new leedle; } leedle variable automatic storage duration , destroyed @ end brace. thing leedle points has dynamic storage duration , not destroyed in code above. must call delete deallocate it.
c++11 adds fourth storage duration:
4: thread: variables thread storage duration allocated when thread begins , deallocated when thread ends.
Comments
Post a Comment