I'm a little confused ;)
Can you please tell me, in the next example, mainCanon is in the heap or stack?
On the heap, fella. The Army instance created with new contains the array of tanks, which each contain the Canon instance so the whole lot is on the heap.
You can't tell from looking at a class definition where the data members will end up. You have to look at where the instance, or the containing instance etc is created.
[EDIT] "On the heap" as in dynamically allocated and not subject to automatic scope lifetime. As has been covered already, the compiler is not bound to implement this as a heap in any normal sense of the word.