Seomaz
Messages postés10Date d'inscriptionjeudi 8 janvier 2009StatutMembreDernière intervention19 mai 2009
-
13 mai 2009 à 14:36
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 2013
-
14 mai 2009 à 16:05
Bonjour,
je pense que le titre est assez explicite...mais je détaille quand même:
lors d'une allocation dynamique (avec l'operateur new), je me retrouve avec un pointeur NULL, alors qu'il me reste plein de place en RAM...
class Bidule
{
...
}
int main()
{
...
Bidule * ptr = new Bidule();
//et la, ptr = =NULL...
...
}
Je n'arrive vraiment pas à saisir pourquoi new a retourné un pointeur NULL, alors que mon processus prend moins de 20Mo en mémoire et qu'il en reste presque 500Mo.
Je suis sous windows 2000, et je travaille sous Visual C++ 6.0.
D'avance merci pour votre aide.
si ça ne marche pas, probablement corruption de la mémoire => vérification de non-dépassement de tous les tableaux, chaînes de caractères, etc utilisés.
Seomaz
Messages postés10Date d'inscriptionjeudi 8 janvier 2009StatutMembreDernière intervention19 mai 2009 13 mai 2009 à 14:53
bonjour Pistol_Pete.
Le constructeur est très gros, mais il marche.
En fait la classe Bidule appartient à une dll utilisée depuis longtemps (je n'ai pas le droit de la modifier, ni de la divulguer d'ailleurs).
Je ne pense pas que le problème vienne du constructeur parceque des "new Bidule()", yen a déjà un gros paquet dans le code...et tous passent.
Encore une fois je ne pense pas non plus que ça soit un problème de mémoire dispo (yen a encore plein!).
Mais je ne comprend toujours pas pourquoi new me renvoie un pointeur NULL....
En plus je ne peut pas m'en passer. Car le pointeur est retourné à une autre fonction, donc si je met un Bidule statique dont je retourne l'adresse, il n'existera plus!
P.S: avant que quelqu'un me propose de changer de compilo, je ne peut pas. C'est visual C++ 6.0, un point c'est tout (sinon je peut chercher du travail ailleurs...)
Seomaz
Messages postés10Date d'inscriptionjeudi 8 janvier 2009StatutMembreDernière intervention19 mai 2009 13 mai 2009 à 15:35
fregolo52,
j'ai déjà débuggé une bonne centaine de fois je pense.
Il ne passe même pas dans le constructeur, l'allocation n'ayant pas réussi... (sinon j'aurai mis "problème de constructeur" dans le titre.)
la question est de savoir quelles sont les causes qui peuvent provoquer l'échec d'une allocation?
sur la msdn il ne disent rien. Ils disent juste que l'opérateur new peut renvoyer NULL, mais ils ne disent pas dans quels cas!!
fregolo52
Messages postés1114Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20214 13 mai 2009 à 15:45
encore une question bête, cette dll est déjà utilisée, donc comment elle est utilisée dans les autres programmes ?
As-tu comparé les setting des projets ? Des warning à la compil ou link sont peut-etre intéressants à exploiter.
Pour test : Si tu as Visual .NET qq part, essaie de convertir ton projet, les compilo .NET sont plus restrictifs et permettent de voir certaines grossièretés que VC6 laisse passer.
Seomaz
Messages postés10Date d'inscriptionjeudi 8 janvier 2009StatutMembreDernière intervention19 mai 2009 13 mai 2009 à 15:54
aucune différence dans les settings. La même opération d'allocation trois lignes plus haut fonctionne à merveille. C'est là que ça devient incompréhensible!
sinon, pour visual .NET, non. Et comme je l'ai déjà dit, JE N'AI PAS LE DROIT de changer de compilo, ça fait partie des exigences de mon client.
Seomaz
Messages postés10Date d'inscriptionjeudi 8 janvier 2009StatutMembreDernière intervention19 mai 2009 14 mai 2009 à 15:43
alors,
après pas mal de temps passé avec l'expert C++ du coin, j'ai trouvé la source de l'erreur : effectivement juju12, j'écrivais bien au dela des limites d'un tableau (la joie des pointeurs...)
Sinon je connaissais pas la fonction GetLasError()... c'est super pratique, mais la c'est typiquement le cas ou elle ne sert à rien, car un new qui renvoie NULL n'est pas considéré comme une erreur par les gens de chez Microsoft..........
Voila, merci à tous.
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 14 mai 2009 à 16:05
C'est tout a fait normal que GetLastError() ne retourne rien pour new: Cette fonction ne marche que pour les fonctions issus de windows.h, donc de API windows...
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr