J'ai une question sur le code suivant:C++ problème destructor avec boost :: scoped_ptr
#include <iostream>
#include <boost/scoped_ptr.hpp>
class Interface
{
};
class A : public Interface
{
public:
A() { std::cout << "A()" << std::endl; }
virtual ~A() { std::cout << "~A()" << std::endl; }
};
Interface* get_a()
{
A* a = new A;
return a;
}
int main()
{
{
std::cout << "1" << std::endl;
boost::scoped_ptr<Interface> x(get_a());
std::cout << "2" << std::endl;
}
std::cout << "3" << std::endl;
}
Il crée la sortie suivante:
1
A()
2
3
Comme vous pouvez le voir, il ne remet pas le destructeur de A. La seule façon dont je vois que le destructeur de A est appelé est d'ajouter un destructeur pour la classe Interface comme ceci:
virtual ~Interface() { }
Mais je veux vraiment éviter toute implémentation dans ma classe Interface et virtual ~Interface() = 0;
ne fonctionne pas (produit des erreurs de l'éditeur de liens se plaignant d'une implémentation non existante de ~Interface()
. Donc ma question est: Qu'est-ce que je dois changer pour que le destructeur soit appelé, mais (si possible) quitte l'interface en tant qu'interface (seulement des méthodes abstraites).
Cette question recouvre essentiellement: http://stackoverflow.com/questions/270917/why -should-i-declare-a-virtual-destructor-for-an-abstract-class-in-c –
Vous pouvez combiner '= 0' avec un corps vide pour éviter l'erreur, mais il y a peu d'avantages à le faire. C'est du C++, et il n'y a pas une "interface" - ce ne sont que des classes - donc il n'y a pas de bonne raison d'éviter les fonctions avec des corps. Surtout dans un cas idiomatique comme un destructeur virtuel. –
J'ai supprimé les balises de pointeur intelligentes, car cela ne concerne pas vraiment les pointeurs intelligents, mais plutôt les destructeurs de classe de base. –