Hola,
Solo para probar tu pregunta, escribi el codigo siguiente:
#include <iostream>
using namespace std;
class Member
{
string name ;
public:
Member(const char *n = "default")
{
name = n;
cout<<"Member "<<name<<" init"<<endl;
}
~Member()
{
cout<<"Member "<<name<<" destroy"<<endl;
}
};
class A
{
Member m1;
Member *m2;
public:
A()
{
m2 = new Member("dynamic");
cout<<"A class init"<<endl;
}
~A()
{
cout<<"A class destroy"<<endl;
}
};
int main(int argc, char *argv[])
{
A a;
}
El resultado es:
ivancp@ivancp-ubuntu:~/projects/source$ ./destructor
Member default init
Member dynamic init
A class init
A class destroy
Member default destroy
En conclusion: Cuando la clase contenedora se destruye, tambien llama a los destructores de los miembros
no punteros, por que si lo hiciera sería un gran problema para las referencias a otras clases y demas artificios que solemos hacer con los punteros, por lo que no es una falla sino una ventaja por que nos permite tener el control total del codigo que escribimos.
Para controla la variable Member *m2 , es necesario liberar la memoria de dicha variable en el destructor de la clase contenedora, de tal modo que queda asi:
~A()
{
delete m2;
cout<<"A class destroy"<<endl;
}
Saludos.