Allocation memoire qui echoue, mais pourquoi??

Résolu
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 mai 2009 - 13 mai 2009 à 14:36
Pistol_Pete Messages postés 1053 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.

12 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
13 mai 2009 à 21:43
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.
3
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
13 mai 2009 à 14:43
Salut
Peux tu nous montrer le constructeur par défaut de ton programme.
A+

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 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...)
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
13 mai 2009 à 15:24
si tu as le code de la dll.debug le constructeur pour voir où ca coince.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 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!!
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
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.
0
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 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.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
13 mai 2009 à 16:43
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.
0
cs_beg0 Messages postés 51 Date d'inscription lundi 17 janvier 2005 Statut Membre Dernière intervention 13 mars 2011 1
14 mai 2009 à 02:22
Question bete: t'as regarde ce que te renvoyer GetLastError(), avant et apres ton alloc ?
0
cs_beg0 Messages postés 51 Date d'inscription lundi 17 janvier 2005 Statut Membre Dernière intervention 13 mars 2011 1
14 mai 2009 à 02:36
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)
0
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 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.
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
Rejoignez-nous