IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Bug ou organisation de mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut Bug ou organisation de mémoire
    Bonjour,
    Je constate un phénomène bizarre

    J'ai écrit un code qui alloue 500000 pointers et un pointers de 700Mb, bref.

    Les 700Mb sont allouer avec succés si je n'ai pas allouer les 500Ko de pointers.
    L'allocation des 700Mb echoue si j'ai allouer les 500Ko Pointers car il n'y à plus de place pour l'adressage
    Le plus étonnant c'est que l'allocation des 700Mb échoue même si j'ai liberer les 500Ko pointers.

    Je ne sais pas ce qu'il se passe pourtant je libére bien les pointers.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    void *pu[1024*500];
    void CmemoryleakDlg::OnBnClickedButton1()
    {
     
    	int cu=1024*500;
     
    	for (int i = 0 ; i < cu;i++)
    	{
    		__try 
    		{
    		//BYTE *p=new BYTE[1*1024];
    		BYTE *p=(BYTE*)malloc(1024);
    		memset(p,0,1024);
    		pu[i]=p;
    		if (p==NULL)
    			p=p;
    		}
    		__except(MainFilterFunction(GetExceptionInformation()))
    		{
    		}
    	}
    	for (int i = 0 ; i < cu;i++)
    	{
    		free(pu[i]);
    		//BYTE *p=(BYTE*)pu[i];
    		//delete p;
    	}
    	BYTE *ii=new BYTE[700*1024*1024]; //CRASH EXCEPTION OUT OF MEMORY
    	if (ii==NULL)
    			ii=ii;
     
    }
    Comment faire sinon pour résoudre ce phénoméne ?
    car j'ai un projet à moi qui utilise beaucoup de pointers.

    Merci.

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    En lisant juste la description, tu devrais avoir quelque chose qui devrait ressembler à ceci :
    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
    19
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++11 -pedantic -fopenmp main.cpp -o main && ./main
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++98 -pedantic -fopenmp main.cpp -o main && ./main
     
    #include <iostream>
    #include <vector>
    #include <thread>
    #include <chrono>
     
     
    int main()
    {
    	std::vector<void *> ps(500000, nullptr);
     
    	std::vector<int> tab((700 * 1000 * 1000) / sizeof(int));
     
    	std::this_thread::sleep_for(std::chrono::seconds(30)); // Le temps de regarder la consommation mémoire
     
    	return 0;
    }
    Ce programme fonctionne bien et prend environ 700 Mo de mémoire vive.

    ---

    Citation Envoyé par yann458 Voir le message
    un pointers de 700Mb
    C'est pas très bien dit, un pointeur fait toujours sizeof(void *).

    Au passage : en C++ (moderne) on n'utilise pas les pointeurs nus (voir memory).

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par yann458 Voir le message
    Bonjour,
    Je constate un phénomène bizarre

    J'ai écrit un code qui alloue 500000 pointeurs et un pointeurs de 700MB, bref.

    Les 700MB sont alloués avec succès si je n'ai pas alloué les 500ko de pointeurs.
    L'allocation des 700MB échoue si j'ai alloué les 500ko pointeurs car il n'y a plus de place pour l'adressage
    Le plus étonnant c'est que l'allocation des 700MB échoue même si j'ai liberé les 500ko pointeurs.

    Je ne sais pas ce qu'il se passe pourtant je libère bien les pointeurs. (Ça ne veut rien dire au passage.)

    [...]

    Comment faire sinon pour résoudre ce phénomène ?
    car j'ai un projet à moi qui utilise beaucoup de pointeurs.

    Merci.
    C'est cadeau.

  4. #4
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    (Je vais peut-etre dire une grosse bétise, mais je pense que c'est une idée)

    Si je me gourre pas, un pointeur est codé sur 4 octet.
    Tu créer deux giga tableau (un de 1024*500 et l'autre de 1024*1024*700).
    Donc d'après mes calcul:
    1024*500+1024*1024*700 = 734 515 200.
    donc 734 515 200 pointeur au total.
    multiplié par la taille d'un pointeur (4 octet): 734515200 * 4 = 2 938 060 800. soit presque 3 Giga juste pour les pointeur (sans compter les malloc que tu fais).

    Si tu as un PC avec 2Go de ram ou 4Go, je pense que c'est normal que ça plante .

    PS: Je tiens à précisé que je ne suis absolument pas sur de mon explication, je cherche d'ou peu provenir le problème et n'étant pas complètement sur de la taille d'un pointeur, mon explication est à prendre comme une indication et non pas comme vérité constante.

  5. #5
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Je confirme. Tu dis une grosse bétise.

    Un pointeur dépend de l'architecture et du compilateur. J'ai connu des pointeurs sur 8, 16, 32 et 64 bits.

    Par ailleurs 500 000 pointeurs vont représenter plusieurs Mo par eux même mais on est loin du Go. En tenant compte de la mémoire allouée on arrive a environ 500 Mo. C'est beaucoup mais c'est inférieur au Go.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par défaut
    ça peut venir d'un problème de répartition de la mémoire.
    Tu peux allouer 700 Mo en 700 bloc de 1 Mo par exemple mais pas d'un seul bloc. Si c'est ça, ça vient du fait que tu n'as pas 700 Mo contigu de libre.

    Tu es sur quel os et tu compil avec quoi?

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par yann458 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (p==NULL)
        p=p;
    Juste comme ça ... pourquoi ?

    Citation Envoyé par skeud Voir le message
    1024*500+1024*1024*700 = 734 515 200.
    donc 734 515 200 pointeur au total.
    Sauf qu'il alloue "seulement" 1024*500 pointeurs, les 700MB ne sont pas alloués pour être utilisés sous forme de pointeurs (c'est des BYTE).

    Citation Envoyé par pepito3364 Voir le message
    ça peut venir d'un problème de répartition de la mémoire.
    Tu peux allouer 700 Mo en 700 bloc de 1 Mo par exemple mais pas d'un seul bloc. Si c'est ça, ça vient du fait que tu n'as pas 700 Mo contigu de libre.
    Physiquement les blocs mémoire sont rarement contigus ... et le système peut allouer virtuellement des ressources qu'il n'a pas.
    Je ne sais pas comment la gestion de mémoire fonctionne sur son OS, mais avec une machine 4Go de RAM de nos jours + le swap du système, c'est étonnant qu'il n'arrive pas à allouer seulement 700Mo (contigus).

    Tu es sur quel os et tu compil avec quoi?
    Windows je pense, en tout cas le bloc __try/__except le suggère.

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut
    Citation Envoyé par pepito3364 Voir le message
    ça peut venir d'un problème de répartition de la mémoire.
    Tu peux allouer 700 Mo en 700 bloc de 1 Mo par exemple mais pas d'un seul bloc. Si c'est ça, ça vient du fait que tu n'as pas 700 Mo contigu de libre.

    Tu es sur quel os et tu compil avec quoi?

    Je travaille sur visual studio 2008 avec windows XP 4 GB de mémoires.
    Ce que je ne comprend pas ,c'est quand je libere mes 500ko pointers avant d'allouer les 700 Mb, et l'allocation des 700 MB echoue.

    Quand mes x pointer sont libérer ,la mémoire est contigu ???

Discussions similaires

  1. Trackeur de bug et corruption de mémoire
    Par yann458 dans le forum Visual C++
    Réponses: 1
    Dernier message: 15/02/2012, 10h54
  2. Réponses: 7
    Dernier message: 24/05/2009, 23h24
  3. Organisation en mémoire d'un processus
    Par peaceinpal dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 07/06/2008, 16h22
  4. organisation mémoire d'un packed array ?
    Par bjl dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 09h24
  5. [Allocation Mémoire] bug ??
    Par Calys dans le forum C++
    Réponses: 4
    Dernier message: 10/02/2006, 00h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo