"Christophe Lephay" a écrit dans le message
de news: 47050bb7$0$27381$"James Kanze" a écrit dans le message de news:
On Oct 4, 5:20 am, "Christophe Lephay"
wrote:Peut-être le constructeur TDataParserException( const
TDataParserException& ) génère-t-il lui-même une exception...
Si c'est le cas, on ne doit pas en appeler le destructeur. On
n'appelle le destructeur que sur des objets (ou sous-objets)
dont le constructeur a fini.
Si j'ai bien compris (rien n'est moins sur), une première exception est
correctement créée dans le throw( ... ) par un premier constructeur, puis
l'exception est recopiée via le constructeur TDataParserException( const
TDataParserException& ).
Si le second constructeur lève une exception, le destructeur est tout de
même appelé sur l'exception construite initialement.
En fait non : en relisant, le destructeur est appelé avant la recopie...
Exact. Et il n'y a pas de recopie si je catch par référence
"Christophe Lephay" <christophe-lephay@wanadoo.fr> a écrit dans le message
de news: 47050bb7$0$27381$ba4acef3@news.orange.fr...
"James Kanze" <james.kanze@gmail.com> a écrit dans le message de news:
1191483894.817735.260470@n39g2000hsh.googlegroups.com...
On Oct 4, 5:20 am, "Christophe Lephay" <christophe-lep...@wanadoo.fr>
wrote:
Peut-être le constructeur TDataParserException( const
TDataParserException& ) génère-t-il lui-même une exception...
Si c'est le cas, on ne doit pas en appeler le destructeur. On
n'appelle le destructeur que sur des objets (ou sous-objets)
dont le constructeur a fini.
Si j'ai bien compris (rien n'est moins sur), une première exception est
correctement créée dans le throw( ... ) par un premier constructeur, puis
l'exception est recopiée via le constructeur TDataParserException( const
TDataParserException& ).
Si le second constructeur lève une exception, le destructeur est tout de
même appelé sur l'exception construite initialement.
En fait non : en relisant, le destructeur est appelé avant la recopie...
Exact. Et il n'y a pas de recopie si je catch par référence
"Christophe Lephay" a écrit dans le message
de news: 47050bb7$0$27381$"James Kanze" a écrit dans le message de news:
On Oct 4, 5:20 am, "Christophe Lephay"
wrote:Peut-être le constructeur TDataParserException( const
TDataParserException& ) génère-t-il lui-même une exception...
Si c'est le cas, on ne doit pas en appeler le destructeur. On
n'appelle le destructeur que sur des objets (ou sous-objets)
dont le constructeur a fini.
Si j'ai bien compris (rien n'est moins sur), une première exception est
correctement créée dans le throw( ... ) par un premier constructeur, puis
l'exception est recopiée via le constructeur TDataParserException( const
TDataParserException& ).
Si le second constructeur lève une exception, le destructeur est tout de
même appelé sur l'exception construite initialement.
En fait non : en relisant, le destructeur est appelé avant la recopie...
Exact. Et il n'y a pas de recopie si je catch par référence
On Oct 4, 5:20 am, "Christophe Lephay"
wrote:"James Kanze" a écrit dans le message de news:
On Oct 3, 6:24 pm, Bastien Durel wrote:Si je récupère l'exception par copie plutôt que par référence, il
commence tout de même par détruire l'instance sur le tas avant de
reconstruire par recopie à partir d'une référence invalide, ce qui
provoque une violation d'accès :Wed Oct 03 18:11:14 2007: Entering in
TDataParserException::TDataParserException(const TDataParserException&)
(1243152)
De même si je fais un affreux "throw *(new TDataParserException());"
C'est difficile à dire. J'ai essayé une version simplifiée de ce
que j'ai compris de ton code, et ça marchait bien (g++ 4.1.0,
sur Solaris/Sparc). Est-ce qu'il peut y avoir un problème dans
l'hiérarchie de TDataParserException ? Ou dans une fonction que
tu appelles dans le constructeur ? Encore que le destructeur de
TDataParserException ne doit être appelé que si le constructeur
a fini. Ou est-ce qu'il y aurait un destructeur d'un objet sur
la pile qui lève une exception ?
Peut-être le constructeur TDataParserException( const
TDataParserException& ) génère-t-il lui-même une exception...
Si c'est le cas, on ne doit pas en appeler le destructeur. On
n'appelle le destructeur que sur des objets (ou sous-objets)
dont le constructeur a fini.
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
On Oct 4, 5:20 am, "Christophe Lephay" <christophe-lep...@wanadoo.fr>
wrote:
"James Kanze" <james.ka...@gmail.com> a écrit dans le message de news:
1191443001.640908.296...@n39g2000hsh.googlegroups.com...
On Oct 3, 6:24 pm, Bastien Durel <bastien.du...@data.fr> wrote:
Si je récupère l'exception par copie plutôt que par référence, il
commence tout de même par détruire l'instance sur le tas avant de
reconstruire par recopie à partir d'une référence invalide, ce qui
provoque une violation d'accès :
Wed Oct 03 18:11:14 2007: Entering in
TDataParserException::TDataParserException(const TDataParserException&)
(1243152)
De même si je fais un affreux "throw *(new TDataParserException());"
C'est difficile à dire. J'ai essayé une version simplifiée de ce
que j'ai compris de ton code, et ça marchait bien (g++ 4.1.0,
sur Solaris/Sparc). Est-ce qu'il peut y avoir un problème dans
l'hiérarchie de TDataParserException ? Ou dans une fonction que
tu appelles dans le constructeur ? Encore que le destructeur de
TDataParserException ne doit être appelé que si le constructeur
a fini. Ou est-ce qu'il y aurait un destructeur d'un objet sur
la pile qui lève une exception ?
Peut-être le constructeur TDataParserException( const
TDataParserException& ) génère-t-il lui-même une exception...
Si c'est le cas, on ne doit pas en appeler le destructeur. On
n'appelle le destructeur que sur des objets (ou sous-objets)
dont le constructeur a fini.
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
On Oct 4, 5:20 am, "Christophe Lephay"
wrote:"James Kanze" a écrit dans le message de news:
On Oct 3, 6:24 pm, Bastien Durel wrote:Si je récupère l'exception par copie plutôt que par référence, il
commence tout de même par détruire l'instance sur le tas avant de
reconstruire par recopie à partir d'une référence invalide, ce qui
provoque une violation d'accès :Wed Oct 03 18:11:14 2007: Entering in
TDataParserException::TDataParserException(const TDataParserException&)
(1243152)
De même si je fais un affreux "throw *(new TDataParserException());"
C'est difficile à dire. J'ai essayé une version simplifiée de ce
que j'ai compris de ton code, et ça marchait bien (g++ 4.1.0,
sur Solaris/Sparc). Est-ce qu'il peut y avoir un problème dans
l'hiérarchie de TDataParserException ? Ou dans une fonction que
tu appelles dans le constructeur ? Encore que le destructeur de
TDataParserException ne doit être appelé que si le constructeur
a fini. Ou est-ce qu'il y aurait un destructeur d'un objet sur
la pile qui lève une exception ?
Peut-être le constructeur TDataParserException( const
TDataParserException& ) génère-t-il lui-même une exception...
Si c'est le cas, on ne doit pas en appeler le destructeur. On
n'appelle le destructeur que sur des objets (ou sous-objets)
dont le constructeur a fini.
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
[...]
Exiting from TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from TDataParserException::TDataParserException(const
TDataBuffer&, const char*, int) (134655336)
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
[...]
Exiting from TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from TDataParserException::TDataParserException(const
TDataBuffer&, const char*, int) (134655336)
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
[...]
Exiting from TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from TDataParserException::TDataParserException(const
TDataBuffer&, const char*, int) (134655336)
On 04/10/2007 09:44, James Kanze wrote:
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
J'ai aussi ajouté la trace de la sortie des fonctions :
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in const char_t* unicodeFromChar(const char*, const char*)
Entering in const char_t* unicodeFromChar(const char*, const char*, int)
TDataParserException: un petit test comme ca, unit.cpp: 72
mMessage is 134655352 mWhere is 134655608
Exiting from TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from TDataParserException::TDataParserException(const
TDataBuffer&, const char*, int) (134655336)
Entering in TDataBuffer::~TDataBuffer() (-1073744192)
here
Entering in const char_t* unicodeFromChar(const char*, const char*)
Entering in const char_t* unicodeFromChar(const char*, const char*, int)
make: *** [unit] Segmentation fault (core dumped)
On dirait donc qu'il passe par le destructeur avant de sortir du
constructeur ...
Plus ça va, moins je comprends.
On 04/10/2007 09:44, James Kanze wrote:
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
J'ai aussi ajouté la trace de la sortie des fonctions :
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in const char_t* unicodeFromChar(const char*, const char*)
Entering in const char_t* unicodeFromChar(const char*, const char*, int)
TDataParserException: un petit test comme ca, unit.cpp: 72
mMessage is 134655352 mWhere is 134655608
Exiting from TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from TDataParserException::TDataParserException(const
TDataBuffer&, const char*, int) (134655336)
Entering in TDataBuffer::~TDataBuffer() (-1073744192)
here
Entering in const char_t* unicodeFromChar(const char*, const char*)
Entering in const char_t* unicodeFromChar(const char*, const char*, int)
make: *** [unit] Segmentation fault (core dumped)
On dirait donc qu'il passe par le destructeur avant de sortir du
constructeur ...
Plus ça va, moins je comprends.
On 04/10/2007 09:44, James Kanze wrote:
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
J'ai aussi ajouté la trace de la sortie des fonctions :
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in const char_t* unicodeFromChar(const char*, const char*)
Entering in const char_t* unicodeFromChar(const char*, const char*, int)
TDataParserException: un petit test comme ca, unit.cpp: 72
mMessage is 134655352 mWhere is 134655608
Exiting from TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Entering in virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from virtual TDataParserException::~TDataParserException()
(-1073744268)
Exiting from TDataParserException::TDataParserException(const
TDataBuffer&, const char*, int) (134655336)
Entering in TDataBuffer::~TDataBuffer() (-1073744192)
here
Entering in const char_t* unicodeFromChar(const char*, const char*)
Entering in const char_t* unicodeFromChar(const char*, const char*, int)
make: *** [unit] Segmentation fault (core dumped)
On dirait donc qu'il passe par le destructeur avant de sortir du
constructeur ...
Plus ça va, moins je comprends.
On Oct 4, 6:52 pm, Bastien Durel wrote:On 04/10/2007 09:44, James Kanze wrote:
[...]J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
J'ai aussi ajouté la trace de la sortie des fonctions :
C'est assez bizarre, parce que...Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Que sont les valeurs dans les parenthèses à la fin ? (Et si
c'est le cas, pourquoi apparaissent-elles comme des int ? Quand
je sors une adresse avec mon g++, sous Linux sur PC, les
adresses sont affichées en hex, comme si elles étaient des
unsigned de la taille correspondant.)
c'est this, casté en int vu que mon g++ 3.2/win me sortait juste 1 sinon.
Enfin, s'il s'agit des adresses converties en int, et que tu te
trouvent sur un PC de 32 bits, ce constructeur-ci est appelé
pour un objet sur la pile : une variable locale ou un
temporaire. Elle ne correspond *pas* à un objet qu'on throw (qui
de toutes apparences se trouve dans les mêmes adresses, plus ou
moins, que des objets alloués dynamiquement).
[...]
Ce que je vois me suggère plusieurs possiblités : que tu crées
un TDataParserException temporaire pour en obtenir un
TDataBuffer, qui sert dans l'objet que tu lèves (le deuxième
TDataParserException), mais qui n'as pas la durée de vie
réquise (erreur de conception : il faudrait le copier, et non
en stocker une référence ou un pointeur ?), ou que tu as créé
un temporaire de type TDataParserException dans le constructeur
du TDataParserException, quelque chose du genre :
TDataParserException::TDataParserException(...)
{
TDataParserException(...) ;
}
Et que là aussi, tu comptes sur des initialisations qui ont eu
lieu dans le temporaire pour initialiser quelque chose dans
l'objet même.
En fait, c'était ça le problème une bête tentative d'économie de code
On Oct 4, 6:52 pm, Bastien Durel <bastien.du...@data.fr> wrote:
On 04/10/2007 09:44, James Kanze wrote:
[...]
J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
J'ai aussi ajouté la trace de la sortie des fonctions :
C'est assez bizarre, parce que...
Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Que sont les valeurs dans les parenthèses à la fin ? (Et si
c'est le cas, pourquoi apparaissent-elles comme des int ? Quand
je sors une adresse avec mon g++, sous Linux sur PC, les
adresses sont affichées en hex, comme si elles étaient des
unsigned de la taille correspondant.)
c'est this, casté en int vu que mon g++ 3.2/win me sortait juste 1 sinon.
Enfin, s'il s'agit des adresses converties en int, et que tu te
trouvent sur un PC de 32 bits, ce constructeur-ci est appelé
pour un objet sur la pile : une variable locale ou un
temporaire. Elle ne correspond *pas* à un objet qu'on throw (qui
de toutes apparences se trouve dans les mêmes adresses, plus ou
moins, que des objets alloués dynamiquement).
[...]
Ce que je vois me suggère plusieurs possiblités : que tu crées
un TDataParserException temporaire pour en obtenir un
TDataBuffer, qui sert dans l'objet que tu lèves (le deuxième
TDataParserException), mais qui n'as pas la durée de vie
réquise (erreur de conception : il faudrait le copier, et non
en stocker une référence ou un pointeur ?), ou que tu as créé
un temporaire de type TDataParserException dans le constructeur
du TDataParserException, quelque chose du genre :
TDataParserException::TDataParserException(...)
{
TDataParserException(...) ;
}
Et que là aussi, tu comptes sur des initialisations qui ont eu
lieu dans le temporaire pour initialiser quelque chose dans
l'objet même.
En fait, c'était ça le problème une bête tentative d'économie de code
On Oct 4, 6:52 pm, Bastien Durel wrote:On 04/10/2007 09:44, James Kanze wrote:
[...]J'ai réussi à le reproduire sur Linux, compilateur g++ 4.1.2
J'ai aussi ajouté la trace de la sortie des fonctions :
C'est assez bizarre, parce que...Entering in TDataParserException::TDataParserException(const char_t*,
const char*, int) (-1073744268)
Que sont les valeurs dans les parenthèses à la fin ? (Et si
c'est le cas, pourquoi apparaissent-elles comme des int ? Quand
je sors une adresse avec mon g++, sous Linux sur PC, les
adresses sont affichées en hex, comme si elles étaient des
unsigned de la taille correspondant.)
c'est this, casté en int vu que mon g++ 3.2/win me sortait juste 1 sinon.
Enfin, s'il s'agit des adresses converties en int, et que tu te
trouvent sur un PC de 32 bits, ce constructeur-ci est appelé
pour un objet sur la pile : une variable locale ou un
temporaire. Elle ne correspond *pas* à un objet qu'on throw (qui
de toutes apparences se trouve dans les mêmes adresses, plus ou
moins, que des objets alloués dynamiquement).
[...]
Ce que je vois me suggère plusieurs possiblités : que tu crées
un TDataParserException temporaire pour en obtenir un
TDataBuffer, qui sert dans l'objet que tu lèves (le deuxième
TDataParserException), mais qui n'as pas la durée de vie
réquise (erreur de conception : il faudrait le copier, et non
en stocker une référence ou un pointeur ?), ou que tu as créé
un temporaire de type TDataParserException dans le constructeur
du TDataParserException, quelque chose du genre :
TDataParserException::TDataParserException(...)
{
TDataParserException(...) ;
}
Et que là aussi, tu comptes sur des initialisations qui ont eu
lieu dans le temporaire pour initialiser quelque chose dans
l'objet même.
En fait, c'était ça le problème une bête tentative d'économie de code
On 05/10/2007 09:37, James Kanze wrote:
Que sont les valeurs dans les parenthèses à la fin ? (Et si
c'est le cas, pourquoi apparaissent-elles comme des int ? Quand
je sors une adresse avec mon g++, sous Linux sur PC, les
adresses sont affichées en hex, comme si elles étaient des
unsigned de la taille correspondant.)
c'est this, casté en int vu que mon g++ 3.2/win me sortait
juste 1 sinon.
En fait, c'était ça le problème une bête tentative d'économie
de code dans un de mes nombreux constructeurs,
On 05/10/2007 09:37, James Kanze wrote:
Que sont les valeurs dans les parenthèses à la fin ? (Et si
c'est le cas, pourquoi apparaissent-elles comme des int ? Quand
je sors une adresse avec mon g++, sous Linux sur PC, les
adresses sont affichées en hex, comme si elles étaient des
unsigned de la taille correspondant.)
c'est this, casté en int vu que mon g++ 3.2/win me sortait
juste 1 sinon.
En fait, c'était ça le problème une bête tentative d'économie
de code dans un de mes nombreux constructeurs,
On 05/10/2007 09:37, James Kanze wrote:
Que sont les valeurs dans les parenthèses à la fin ? (Et si
c'est le cas, pourquoi apparaissent-elles comme des int ? Quand
je sors une adresse avec mon g++, sous Linux sur PC, les
adresses sont affichées en hex, comme si elles étaient des
unsigned de la taille correspondant.)
c'est this, casté en int vu que mon g++ 3.2/win me sortait
juste 1 sinon.
En fait, c'était ça le problème une bête tentative d'économie
de code dans un de mes nombreux constructeurs,