About destructors. Here is the 12.4.8 paragraph of the standard, that proves second "yes":
After executing the body of the destructor and destroying any automatic objects allocated within the body, a
destructor for class X calls the destructors for X’s direct non-variant non-static data members, the destructors
for X’s direct base classes and, if X is the type of the most derived class (12.6.2), its destructor calls the
destructors for X’s virtual base classes. All destructors are called as if they were referenced with a qualified
name, that is, ignoring any possible virtual overriding destructors in more derived classes. Bases and
members are destroyed in the reverse order of the completion of their constructor (see 12.6.2). A return
statement (6.6.3) in a destructor might not directly return to the caller; before transferring control to the
caller, the destructors for the members and bases are called. Destructors for elements of an array are called
in reverse order of their construction (see 12.6).
But please note, that containers usually don't track contents' chronology, so they may behave in non-intuitive way. For example std::vector may destruct its objects from begin to the end, despite the fact, that usually they are filled with push_back() or something like that.
Thusly, you cannot implement ctor-dtor stack by containers.
This is my little illustration:
#include <vector>
#include <stdio.h>
struct c
{
c() : num(++count) { fprintf(stderr, "ctor[%u], ", num);}
~c(){ fprintf(stderr, "dtor[%u], ", num);}
private:
static unsigned count;
unsigned num;
};
unsigned c::count = 0;
int main()
{
std::vector<c> v(5);
}
... and I got:
ctor[1], ctor[2], ctor[3], ctor[4], ctor[5], dtor[1], dtor[2], dtor[3], dtor[4], dtor[5],