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 :

boost::multi_array, pointeurs et delete


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut boost::multi_array, pointeurs et delete
    Bonjour à tous.

    Voila mon problème. J'utilise boost pour gérer un tableau 2D de pointeurs, et le programme plante au moment du delete. Est-ce-que quelqu'un peut m'éclairer

    boost::multi_array<T*, 2> boo( boost::extents[width][height] );

    std::fill( boo.data(), boo.data() + boo.num_elements(), new T[NB_MAX] );

    //Traitements......

    for(int i=0; i<LARGEUR; i++)
    for(int j=0; j<HAUTEUR; j++)
    delete[] boo[i][j];
    Je précise que T correspond dans mon cas à une classe contenant juste des variables (type int ou float).

    Par ailleurs je cherche une meilleur méthode pour stocker le T*, mais l'utilisation par exemple de vector<T> s'est avéré totalement inadapté en terme de vitesse (j'ai beaucoup d'accès au différents élément T de chaque case du tableau 2D (environ 400000 accès en tout).

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Si je ne me trompe pas, boo[][] n'est PAS un tableau mais un objet, il faut donc le détruire avec delete et non delete[], ce dernier étant réservé pour les tableaux alloués avec new[]
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    en fait cela ne change pas. l'erreur subsiste

    T* correspond à un tableau contenant NB_MAX objets T (new T[NB_MAX]).

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Si je ne me trompe pas, boo[][] n'est PAS un tableau mais un objet, il faut donc le détruire avec delete et non delete[], ce dernier étant réservé pour les tableaux alloués avec new[]
    oui mais boo[i][j] est un tableau (new T[NB_MAX])

    en revanche tu remplis ta matrice avec le même pointeur !
    "new T[NB_MAX]" ne sera exécute qu'une fois et assigné a toute ta matrice.
    Donc quand tu le détruit la première fois sa passe mais dés le deuxième élément il n'y a plus rien a détruire => plantage

    si tu veux instancier chaque case tu dois faire une boucle comme pour la destruction

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    d'accord, c'est pour ça que le plantage se fait que si je passe dans plusieurs cases du tableau.

    question : si c'est le même pointeur, alors chaque case contient le même T*

    comment avoir une autre méthode de stockage

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    En fait je me suis mal exprimé chaque case contient un pointeur différant mais chacun de ces pointeur pointe vers le même emplacement mémoire.

    par contre tu utilises un tableau a deux dimension pour stocké des tableaux. donc au final tu a un tableau a 3 dimensions. Pourquoi ne pas faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::multi_array<T, 3>
    tu n'aurais pas a gérer la mémoire ainsi

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    oui oui c'est aussi une possibilité.
    en fait il était plus simple de faire ainsi, mais finalement je pense essayer de cette manière (je pourrai ainsi comparer avec une solution de plus).
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boost Serialization / pointeurs / polymorphisme
    Par Feriaman dans le forum Boost
    Réponses: 2
    Dernier message: 27/07/2011, 05h50
  2. Boost Serialization pointeur
    Par pavel dans le forum Boost
    Réponses: 8
    Dernier message: 09/02/2010, 18h25
  3. [boost::multi_array]accés au fonction membres des objets stocké.
    Par dillinger91 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 31/12/2008, 20h11
  4. Réponses: 6
    Dernier message: 17/06/2008, 12h55
  5. Pointeur et delete
    Par syn42 dans le forum SL & STL
    Réponses: 3
    Dernier message: 12/09/2007, 09h13

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