2010-02-18 5 views
3

Dire que j'ai quelques struct comme ceci:mémoire dynamique et struct héritées en C++

struct A{ 
int someInt; 
} 

struct B : public A{ 
int someInt; 
int someOtherInt; 
} 

et une classe:

class C{ 
A *someAs; 
void myFunc(A *someMoreAs){ 
    delete [] someMoreAs; 
} 
} 

aurait cette cause un problème:

B *b=new B[10]; 
C c; 
c.myFunc(b); 

Parce que il supprime b, en pensant que c'est de type A, qui est plus petit. Cela causerait-il une fuite de mémoire? Par ailleurs, disons que je veux allouer plus de la même chose que b dans myFunc, en utilisant new, mais sans que C sache si b est de A ou de B? Un ami sugegsted typeof, mais VC ne semble pas supporter cela.

+0

VC ne supporte trop typeof(). Quelle version utilisez-vous et comment le code échoue-t-il? (Notez que vous n'avez pas besoin de l'utiliser dans votre cas ...) – Macke

+0

Je ne voudrais pas essayer d'indexer ce tableau depuis myFunc(), btw ...;) – Macke

Répondre

4

Il n'y aura pas de fuite de mémoire dans ce cas particulier, car A et B sont des données POD (données anciennes) et leur contenu ne nécessite donc aucune destruction. Néanmoins, il est recommandé de toujours avoir un destructeur virtuel dans une classe (de base) dont on suppose qu'il est hérité. Si vous ajoutez un destructeur virtuel à A, toute suppression effectuée via A* appellera également les destructeurs dérivés appropriés (y compris la destruction des membres des classes dérivées). Cependant,

virtual ~A() {} 

avis que vous ne pouvez pas utiliser l'héritage dans des tableaux de type de base, précisément parce que la taille réelle des objets peut varier.

Qu'est-ce que vous voulez vraiment est probablement un tableau de pointeurs à la classe de base:

std::vector<A*> someAs; 

Ou l'équivalent Boost (avec gestion automatique de la mémoire et plus agréable API):

boost::ptr_vector<A> someAs;