I think that you are confusing “stack/heap allocation” and “automatic variable”.
Automatic variables are automatically destroyed when going out of context.
Stack allocation is the fact that the memory is allocated on the execution stack. And variable allocated on the stack are automatic variables.
Also, members are automatic variables whose destructors get called when its owner is destroyed. In the case of pointers, they are destroyed but not the underlying object, you have to explicitly call delete. To make sure that the underlying object is destroyed you have to use smart or unique pointers.
To put it another way: variables/members that you have to call delete on, are not automatic variables.
Lastly, member of a class are allocated on the same memory segment of the its owner.
In you code:
A.m_Bis an automatic variable. If A is on the stack so is B and if A is on the heap so is B.B.m_iand D.m_i are an automatic variables and will be allocated on the same memory segment of their owner- The pointer
C.m_Dis an automatic variable, but the pointed object of type D is not, you have to explicitly call delete on the pointer to delete the underlying object. So, the pointer C.m_D is allocated on the same memory segment, but not the underlying objet. It’s cleary allocated by new and will be on the heap.
So:
- Case 1: Everything is on the stack and automatic (ie: destroyed automatically).
- Case 2:
myA2is on the heap and not automatic (you have todelete myA2). Its memberm_B2is an automatic variable that will be destroyed whenmyA2is destroyed. Also sincemyA2is on the heap,m_B, like any member of a class, is in the same memory space the heap too. - Case 3:
myC1is on the stack and is an automatic variable, The pointer tom_Dis on the stack too, but not the object pointed bym_Dwhich is allocated by new on the heap. - Case 4: Same as case3 but
myC2is on the heap and is not automatic. So you have to deletemyC2(which will deletem_D).