Yes, you should use automatic (stack) lifetimes where possible, and heap lifetimes where you have to.
n.b. with your example of using
new, it returns a pointer to an object (in Java, every "object"-type variable is implicitly a pointer, but in C++ you need the "
*")
{ Object* obj1 = new Object();//obj1 is a local variable, that is a pointer to a heap allocated object Object& obj2 = *(new Object()); //a reference is pretty much the same thing as a pointer, but looks like it isn't ;) Object obj3;//local variable (stack allocation) delete obj1; delete &obj2; delete &obj3;//this is an error! It wasn't made with 'new' so you can't use 'delete'}//obj3 deleted here automatically due to the stack unwindingI am also confused by memory managment in c++. When stack object is freed is there a memory "hall" in stack.
You can't manually "free" an object from the stack. Stack frames are pushed and popped for each "block" of code (basically every set of "{ ... }"). Whenever a "}" is reached, all the stack variables that were created in that block are destroyed. So there are never any holes.
For an example of where stack allocation isn't applicable, imagine a function that makes a new monster appear:
Monster* SpawnMonster()
{
Monster m;
return &m;//error! m is created with the same scope as this function. When the function returns, m is "deleted".
}
Monster* SpawnMonster()
{
Monster* m = new Monster();
return m;//correct, but someone has to delete this at some point, otherwise you've got a memory leak
}
shared_ptr<Monster> SpawnMonster()
{
return shared_ptr<Monster>(new Monster());//also correct. This acts more like what you're used to in Java. When there are no more shared_ptr's that reference the Monster, it will automatically be deleted.
}