Mon problème est que si A lance une exception MyException pendant la construction de a1, effectivement a2 n'est pas construit, l'exception passe dans le catch, mais CodeGuard me signale une fuite de mémoire m'indiquant que a1 est quand même construit, et n'a pas été correctement détruit, alors que si je ne me trompe pas il ne devrait pas l'être puisque l'exception se déclenche dans le constructeur!
J'ai essayé de mettre des try catch dans le constructeur de A, dans celui de B (en plus de ceux dans foo) mais évidemment ça ne sert à rien...
J'ai bien vérifié toutes les étapes de construction de A, et tous les pointeurs sont enchassés dans des pointeurs intelligents... Donc là je nage complétement...
Auriez-vous une réponse à ce problème?
Merci d'avance
Ok, merci de tes solutions, elles correspondent parfaitement...
Mais là je suis face à un autre problème:
Soient les classes suivantes:
class A
{
public:
A() {};
};
class B
{
private:
boost::scoped_ptr<A> a1;
boost::scoped_ptr<A> a2;
Mon problème est que si A lance une exception MyException pendant la
construction de a1, effectivement a2 n'est pas construit, l'exception
passe dans le catch, mais CodeGuard me signale une fuite de mémoire
m'indiquant que a1 est quand même construit, et n'a pas été correctement
détruit, alors que si je ne me trompe pas il ne devrait pas l'être
puisque l'exception se déclenche dans le constructeur!
J'ai essayé de mettre des try catch dans le constructeur de A, dans celui
de B (en plus de ceux dans foo) mais évidemment ça ne sert à rien...
J'ai bien vérifié toutes les étapes de construction de A, et tous les
pointeurs sont enchassés dans des pointeurs intelligents... Donc là je
nage complétement...
Mon problème est que si A lance une exception MyException pendant la construction de a1, effectivement a2 n'est pas construit, l'exception passe dans le catch, mais CodeGuard me signale une fuite de mémoire m'indiquant que a1 est quand même construit, et n'a pas été correctement détruit, alors que si je ne me trompe pas il ne devrait pas l'être puisque l'exception se déclenche dans le constructeur!
J'ai essayé de mettre des try catch dans le constructeur de A, dans celui de B (en plus de ceux dans foo) mais évidemment ça ne sert à rien...
J'ai bien vérifié toutes les étapes de construction de A, et tous les pointeurs sont enchassés dans des pointeurs intelligents... Donc là je nage complétement...
Qu'est-ce que ça donne si tu utilises std::auto_ptr<> à la place de boost::scoped_ptr<> ?
Même chose...
par contre en ne créant pas a1 et a2 avec new, comme suit:
class B { private: foo();
A a1; A a2; public: B(); };
B::B() { foo(); }
B::foo() { a1 = A; a2 = A; }
tout marche impecc'
Le problème viendrait de mes constructeurs?
Fabien LE LEZ
On 08 Sep 2004 23:15:06 GMT, "Michaël Delva" :
CodeGuard me signale une fuite de mémoire m'indiquant que a1 est quand même construit, et n'a pas été correctement détruit, alors que si je ne me trompe pas il ne devrait pas l'être puisque l'exception se déclenche dans le constructeur!
Attention : a1, objet de type boost::scoped_ptr<A>, est bien construit, car membre de B. C'est l'objet sur lequel a1 garde un pointeur, qui n'a pas été construit.
De toutes façons, d'après le message, le problème me semble venir de plus haut (i.e. de la fonction qui crée l'objet de classe B).
Essaie le programme suivant et regarde ce que Codeguard en pense :
class Exception {};
class A { public: A (bool lance_exception) { if (lance_exception) throw Exception(); } };
B::B() { a1.reset (new A (false)); a2.reset (new A (true)); }
int main() { try { B b; cerr << "B::f() : " << b.f() << endl; } catch (Exception const&) { cerr << "Une exception a été lancée" << endl; } }
-- ;-)
On 08 Sep 2004 23:15:06 GMT, "Michaël Delva"
<michael_delva@i_cant_remember.com>:
CodeGuard me signale une fuite de mémoire
m'indiquant que a1 est quand même construit, et n'a pas été correctement
détruit, alors que si je ne me trompe pas il ne devrait pas l'être
puisque l'exception se déclenche dans le constructeur!
Attention : a1, objet de type boost::scoped_ptr<A>, est bien
construit, car membre de B. C'est l'objet sur lequel a1 garde un
pointeur, qui n'a pas été construit.
De toutes façons, d'après le message, le problème me semble venir de
plus haut (i.e. de la fonction qui crée l'objet de classe B).
Essaie le programme suivant et regarde ce que Codeguard en pense :
class Exception {};
class A
{
public:
A (bool lance_exception) { if (lance_exception) throw Exception();
}
};
CodeGuard me signale une fuite de mémoire m'indiquant que a1 est quand même construit, et n'a pas été correctement détruit, alors que si je ne me trompe pas il ne devrait pas l'être puisque l'exception se déclenche dans le constructeur!
Attention : a1, objet de type boost::scoped_ptr<A>, est bien construit, car membre de B. C'est l'objet sur lequel a1 garde un pointeur, qui n'a pas été construit.
De toutes façons, d'après le message, le problème me semble venir de plus haut (i.e. de la fonction qui crée l'objet de classe B).
Essaie le programme suivant et regarde ce que Codeguard en pense :
class Exception {};
class A { public: A (bool lance_exception) { if (lance_exception) throw Exception(); } };
Chacune des fonctions permet d'initialiser le rendu vidéo...
Quand je veux tester avec une exception, je donne un faux path de fichier, et l'exception se lance dans la fonction RenderFileToVMR9, que voici (exception lancée dans l'appel à AddSourceFilter)
Chacune des fonctions permet d'initialiser le rendu vidéo...
Quand je veux tester avec une exception, je donne un faux path de
fichier, et l'exception se lance dans la fonction RenderFileToVMR9, que
voici (exception lancée dans l'appel à AddSourceFilter)
Chacune des fonctions permet d'initialiser le rendu vidéo...
Quand je veux tester avec une exception, je donne un faux path de fichier, et l'exception se lance dans la fonction RenderFileToVMR9, que voici (exception lancée dans l'appel à AddSourceFilter)