Allocation memoire qui echoue, mais pourquoi?? [Résolu]

Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
- - Dernière réponse : Pistol_Pete
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Derniè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.
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
3
Merci
Est-ce-qu'une allocation d'un autre type juste avant ce que tu veux faire, et/ou après, réussit?
du genre :

unsigned *test=new unsigned[2*sizeof(Bidule)];
Bidule*ptr=new Bidule;
unsigned *test2=new unsigned[2*sizeof(Bidule)];

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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 210 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_juju12
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
Salut
Peux tu nous montrer le constructeur par défaut de ton programme.
A+

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
Commenter la réponse de Pistol_Pete
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
0
Merci
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...)
Commenter la réponse de Seomaz
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
si tu as le code de la dll.debug le constructeur pour voir où ca coince.
Commenter la réponse de fregolo52
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
0
Merci
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!!
Commenter la réponse de Seomaz
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
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.
Commenter la réponse de fregolo52
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
0
Merci
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.
Commenter la réponse de Seomaz
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
aie aie aie !!
ca me dit quelque chose !!
c'est déjà eu ce genre de pb avec WSAStartup qui échouait suivant sa position dans le code.

vu que c'était pour un outil de simulation j'ai pas approfondi.

bon courage.
Commenter la réponse de fregolo52
Messages postés
52
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
13 mars 2011
1
0
Merci
Question bete: t'as regarde ce que te renvoyer GetLastError(), avant et apres ton alloc ?
Commenter la réponse de cs_beg0
Messages postés
52
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
13 mars 2011
1
0
Merci
sinon, puisque tu as la "chance" d'etre sous VC++, tu as essayer les fonctions de debug de microsoft : genre _CrtMemCheckpoint(), _CrtDumpMemoryLeaks() ect.
Par contre je te l'accord, c'est vraiment sortir l'artillerie lourde et c'est pas forcement facile a comprendre comment ca marche.
Moi j'ai utilise : http://www.codeproject.com/KB/cpp/MLFDef.aspx
http://msdn.microsoft.com/en-us/library/e5ewb1h3(VS.80).aspx
http://msdn.microsoft.com/en-us/library/974tc9t1(VS.80).aspx (bon, après sur MSDN il faut se balader, c'est juste un point de départ)
Commenter la réponse de cs_beg0
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
0
Merci
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.
Commenter la réponse de Seomaz
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete