Bonjour,
Imaginons que je possède le code suivant :
new va allouer l'espace mémoire puis il va l'initialisé en appelant le constructeur de Foo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <iostream> class Foo{ public : Foo(void){ throw int(0); } } int main(void) { Foo * ptr = nullptr; try { ptr = new Foo; } catch (int) { std::cout << ptr << std::endl; } }
Mais ce dernier va lancer une exception, je vais donc entrer dans le catch, ptr valant toujours nullptr.
Il me semblerait logique que new ai lui-même désalloué l'espace qu'il a alloué sinon on risquerait d'avoir des fuites de mémoires.
Mais que dit exactement la norme à ce sujet ?
Si j'utilise ensuite un new [], et qu'un seul des constructeur échoue, ce serait dommage qu'il désalloue tout l'espace mémoire et qu'il détruise les objets déjà construits.
Mais d'un autre côté, comme on a une exception, on ne peux pas récupérer de pointeurs et on se retrouverait dans le cas précédant avec une fuite mémoire.
Je vois ce que le compilateur doit faire, mais j'aimerais savoir ce qu'en pense la norme.
Partager