D'autres ont mentionné que vous avez new[]
avec delete
et ne correspondent pas, vous devez changer delete
pour delete[]
pour le réparer. Cependant, ce n'est que le premier de vos problèmes.
Vous devez également implémenter (ou au moins déclarer comme privé) le constructeur de copie et l'opérateur d'affectation de copie. Sinon, pensez à ce qui se passe quand vous faites ceci:
{
Container c1;
Container c2(c1);
} // c2.~Container(); // frees the memory pointed to by 'BasePointer'
// c1.~Container(); // also frees the memory pointed to by 'BasePointer'.
Depuis le membre BasePointer
des deux c1
et c2
des points au même tableau, il se libère deux fois.
Il existe des alternatives plus faciles à utiliser:
Pensez à utiliser un std::vector
où vous pourriez utiliser autrement un tableau alloué dynamiquement. Puisque votre classe est appelée Container
, je suppose que vous essayez d'implémenter un conteneur propriétaire de ressources, donc peut-être que vous ne voulez pas l'utiliser. Envisagez d'utiliser un boost::scoped_ptr
ou std::unique_ptr
(si votre compilateur le prend en charge) pour gérer la propriété du pointeur. Ces deux méthodes suppriment la génération du constructeur de copie implicitement déclaré, ce qui vous oblige à implémenter le vôtre si vous tentez réellement de les utiliser.
Même si vous implémentez un Container
, vous devriez toujours profiter des conteneurs plus primitifs pour faire le levage de charges lourdes pour vous (ou, au moins réimplémenter ces conteneurs primitifs de sorte que le levage de charges lourdes est consolidée dans une petite ensemble d'utilitaires). Enfin, en tant que point stylistique, vous n'avez pas besoin d'utiliser malloc
pour un conteneur. La bibliothèque standard fournit std::allocator
qui peut être utilisé pour allouer de l'espace et construire des objets.
Il est appelé * destructor *, comme dans la destruction. Pas déconstructeur. :) – jalf
@jalf Droit, désolé. – Maxpm