Nous avons une classe dont le comportement sémantique est comme ce qui suit: -Destructeurs de lancer, corruption de mémoire?
struct Sample
{
~Sample() throw()
{
throw 0;
}
};
void f()
{
try
{
delete new Sample;
}
catch (...){
}
}
Je sais que jeter des exceptions dans dtors est le mal; mais l'abandon d'une ressource de bibliothèque de tierce partie jette une exception (mais peut être ré-acquis immédiatement, quelque chose d'étrange!). Il existe également un pool de cette ressource, par exemple un tableau/conteneur de classe Sample. Donc, il y a deux cas à considérer: la destruction d'un objet alloué dynamiquement et la destruction d'un tableau d'objets alloués dynamiquement.
Actuellement, l'application se bloque aléatoirement à différents points d'exécution uniquement lorsque la version de tableau (pool) est utilisée. Nous pensons que cela est dû à une corruption de la mémoire, mais pourquoi la version non-poolée fonctionne-t-elle? Qu'arrive-t-il à la mémoire allouée?
Est-ce un comportement indéfini? Que se passe-t-il dans le cas d'un tableau? Est-ce que les dtors (atleast, not memory) de tous les éléments d'un tableau (disons si le dteur du premier élément est lancé) sont appelés?
Merci à l'avance,
EDIT-1: Eh bien, nous avons suivi le bas à dtors de certains éléments-tableau ne sont pas appelés. Mais la mémoire allouée ne semble pas avoir des problèmes ... est la section 5.3.5.7 Après de SC22-N-4411.pdf)
If the value of the operand of the delete-expression is not a null pointer value, the delete-expression will
call a deallocation function (3.7.4.2). Otherwise, it is unspecified whether the deallocation function will be
called. [ Note: The deallocation function is called regardless of whether the destructor for the object or some
element of the array throws an exception. —end note ]
< \ snip>
On dirait la mémoire est toujours désaffecté dans de tels cas. Ai-je raison d'interpréter la norme?
Actuellement, je ne souhaite pas modifier la classe Sample. Je suis au courant de stt :: terminate() etc. Ayant une spécification throw(). car dtor est également inutile car il n'empêche aucune exception de s'échapper ni n'empêche quiconque de lancer. Ma question est plus inclinée vers «Qu'est-ce qui arrive à la mémoire? Est-il libéré? Est-ce que c'est une fuite? Ou est-ce un comportement indéfini? La citation des sections standard C++ vous aidera. – Abhay
O.K. La norme C++ est assez laconique pour moi aussi. La seule raison pour laquelle je demande est; si je suis d'interdire jeter/échapper exception de dtors dans mon projet actuel, je aurais besoin de l'aide d'un «avocat de spécifications» :-) – Abhay