|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Bonjour à tous,
suite à des recherches sur cette question, je ne trouve pas de réponse pertinente. Voici déjà le code d'exemple: Code :
Merci beaucoup pour vos réponses. |
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Bonjour,
A ce que je sache, new lancera une exception en cas d'erreur lors de l'allocation mémoire. Il existe toute fois un moyen pour forcer new à renvoyer NULL en cas d'erreur :
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
20
|
|
|
#3 |
|
Membre Expert
![]() Chercheur Inscription : mars 2010 Messages : 1 143 ![]() |
Salut,
l'entrée de la faq Peut-on lever des exceptions dans les constructeurs? correspond me semble-t-il à ce que tu cherches. |
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Merci beaucoup pour vos réponses, mais cela n'indique pas si la valeur de ptA sera encore 0 si il y a eu un problème ; ceci dû au fait qu'elle est initialisée à 0.
En parallèle, je vais regarder (m'instruire |
|
|
00
|
|
|
#5 | |
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
http://en.cppreference.com/w/cpp/mem...w/operator_new
Citation:
|
|
|
|
10
|
|
|
#6 |
|
Membre Expert
![]() Chercheur Inscription : mars 2010 Messages : 1 143 ![]() |
Jette un oeil à Que se passe-t-il si aucun bloc catch n'existe pour traiter une exception?
Si new lance une exception et que tu ne la récupères pas, tu vas sortir de ta fonction en détruisant tous les objets locaux, en l'occurence ptA, et ta question n'a donc pas vraiment de sens. Si tu préfères, la valeur de ptA ne sera pas modifiée mais sera détruite. |
|
|
10
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Merci beaucoup,
j'écris donc Code :
Merci |
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Chercheur Inscription : mars 2010 Messages : 1 143 ![]() |
Oui, mais il faut bien noter la subtilité : en cas de problème d'allocation, new renverra le pointeur nul quelle que soit la valeur préalable de ptA. Ce n'est pas le fait d'avoir initialisé ptA à zéro qui provoque ce comportement. Autrement dit, ptA est bien modifié dans ce cas.
|
|
|
20
|
|
|
#9 | |||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Citation:
Je reprends du code et il y a à tout bout de champ ce type de chose : Code :
Merci beaucoup |
|||
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Chercheur Inscription : mars 2010 Messages : 1 143 ![]() |
|
|
|
00
|
|
|
#11 | ||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
C'est bien ce que je pensais.
Et donc cette vérification est pertinente : Code :
|
||
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Chercheur Inscription : mars 2010 Messages : 1 143 ![]() |
Oui, à ceci près que cela ne sert plus à rien d'initialiser ptA à zéro. Dans l'exemple précédent, cela avait du sens car si new levait une exception, alors ptA pouvait être détruit car préalablement initialisé. Ce qui n'avait pas de sens, c'était le test succédant à new.
|
|
|
10
|
|
|
#13 | ||
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
une autre verification serait
Code :
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
||
|
00
|
|
|
#14 | |
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Citation:
Dans le premier cas, le fait d'initialiser ptA à 0 permet de garder cette valeur 0 si il y a échec de new ? |
|
|
|
00
|
|
|
#15 | ||
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
Si j'ai bien compris, avec truc = new (std::nothrow) Truc();, tu as l'équivalent (à la portée de truc près) de
Code :
En tant que telle, truc = new (std::nothrow) Truc(); est une affectation qui réussit systématiquement. tu n'imagine pas de faire int i = 0; i = f();… le 0 serait inutile.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
||
|
00
|
|
|
#16 |
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 539 ![]() |
|
|
|
00
|
|
|
#17 | |||||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Citation:
- toute variable déclarée doit être initialisée avant d'être utilisée. - tout pointeur déclaré doit être initialisé à 0 avant d'être utilisé. - l'opérateur new doit être utilisé sur un pointeur préalablement initialisé à 0. - à la suite de l'opérateur delete sur un pointeur, ce pointeur doit être mis à 0. - etc. J'ai par contre toujours cette question en suspend : Code :
Merci encore à tous |
|||||
|
|
00
|
|
|
#18 | ||||
|
Expert Confirmé Sénior
![]() ![]() Emmanuel DelogetDéveloppeur informatique Inscription : septembre 2007 Messages : 1 826 ![]() |
Citation:
De manière générale, en C++ le test de la valeur d'un pointeur (enfin, le test == NULL) est souvent signe que le programmeur a fait quelque chose qu'il ne devait pas faire. Dans ce langage, il existe tant de manière de s'assurer qu'un pointeur n'est pas NULL avant de l'utiliser que le test est soit superflu, soit signe d'un manque de compréhension du code ou d'une architecture bancale (comme, par exemple, une mauvaise analyse de la durée de vie d'un objet). Il faut se rappeler qu'un pointeur appartient à quelqu'un, et ce quelqu'un a une durée de vie. Si l'objet alloué n'a pas la même durée de vie que son propriétaire, alors c'est que ce n'est pas le bon propriétaire. Citation:
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...] Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi. Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça. Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas. Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas. |
||||
|
10
|
|
|
#19 | ||||||
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 057 ![]() |
La version classique de new lance une exception si il y a un problème (allocation ou construction), si elle n'est pas du tout attrapé, alors le programme termine.
Si l'ensemble déclaration de la variable, appel à new et affectation à la variable est dans un bloc try avec un catch qui attrape cette exception, alors la question ne se pose pas, en cas d'exception une fois attrapée cette variable n'existe plus. Code :
Code :
On peut tricher un peu en utilisant une variable intermédiaire pour "forcer" l'ordre entre la construction et l'affectation à la variable : Code :
Malheureusement, il est fort probable que le compilateur optimise un tel code (ie il considère que la variable q ne sert à rien). NB: Ces morceaux de code n'ont de sens qu'avec les règles de programmation qui te sont imposées, ils ne servent à rien dans un contexte normal (les exceptions font leur boulot).
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
||||||
|
|
10
|
|
|
#20 | ||||||||||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 120 ![]() |
Citation:
Citation:
Citation:
Citation:
Merci à tous. |
||||||||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com