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 :

Comment utiliser un Vector de taille inconnue


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 68
    Points
    68
    Par défaut Comment utiliser un Vector de taille inconnue
    Bonjour,

    Je fais actuellement quelque tutoriel sur openCV en utilisant visual studio 2012 et je rencontre un problème que je n'arrive pas à résoudre.

    quand mon programme arrive a la dernière ligne du main (sur le return final donc) il "plante" avec un "has triggered a breakpoint" en ouvrant le fichier "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\dbgheap.c" a cette endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
            const void * pUserData
            )
    {
            if (!pUserData)
                return FALSE;
     
            if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
                return FALSE;
     
            return HeapValidate( _crtheap, 0, pHdr(pUserData) );
    }
    et avec cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HEAP[Tracker10.exe]: Invalid address specified to RtlValidateHeap( 00740000, 031884D0 )
    Voici mon code que j'ai réduis au maximum.
    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
    #include <iostream>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\nonfree\features2d.hpp>
     
    #pragma comment(lib, "opencv_highgui247d.lib") 
    #pragma comment(lib, "opencv_core247d.lib") 
    #pragma comment(lib, "opencv_features2d247d.lib") 
    #pragma comment(lib, "opencv_nonfree247d.lib") 
     
    int main() {
    	cv::Mat object = cv::imread("C:/Users/weanz/Downloads/Tracker10/Debug/label1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
     
    	if(object.empty())
    		exit(0);
     
    	std::vector<cv::KeyPoint> keypointsO;
     
    	cv::SurfFeatureDetector surf(1000);
    	surf.detect(object,keypointsO);
     
            std::cout <<"size = "<<keypointsO.size();
    	std::cout <<"Avant crash";
    	system("pause"); // ne crash pas
    	return 1; // crash
    }
    Le seul moyen pour faire fonctionner le programme est de spécifier la taille du vector a la ligne 16 qui doit être égal à la valeur obtenu a la ligne 21
    On obtient alors ceci : "std::vector<cv::KeyPoint> keypointsO(964);".

    Hélas la taille varie en fonction des dimensions de l'image et de la valeur d'initialisation de surf. Comment faire pour calculer cette taille a l'avance ou pour utiliser un autre moyen d'initialisation qui ne me force pas a connaitre la taille du vector dès le début?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je ne m'y connais pas du tout en OpenCV, mais ce genre d'erreurs apparaît lors de la destruction de l'une de tes variables. Arrivé à la ligne "return", le compilateur va détruire les variables locales de la fonction. Pour voir dans quel ordre le compilateur va détruire ces objets, je te recommande de lire cette FAQ: Cette erreur peut arriver par exemple lorsque l'on essaie de détruire un objet qui est déjà (ou mal) détruit.

    Comme je n'y connais absolument rien en OpenCV, je te recommande de mettre en commentaire tout ton code, et de décommenter au fur et à mesure pour voir vraiment où ça coince.
    Ou alors faire un step by step pour voir la destruction de quel objet pose problème.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Ce que ça veut dire, c'est qu'un de tes objets tente un delete sur une adresse qui ne provient pas de la Heap. Explications possibles (je n'ai pas assez d'info en particulier sur openCV pour savoir de quoi il retourne):
    1. un des objets en cours de destruction tente un delete sur une adresse de variable locale ou de paramètre (donc qui provient de la pile)
    2. double delete: on tente un delete sur une adresse qui avait bien été allouée dynamiquement, mais qui a déjà été libérée par delete

    Si ça dépend de la taille de ton vector, je te conseille de creuser à nouveau la doc de cv::KeyPoint et de la fonction detectà laquelle tu passes le vector, il doit y avoir un problème d'élément non copiable qui t'a échappé, à moins que tu n'aies un moyen d'obtenir par un appel préalable "la taille trouvée ligne 21" pour dimensionner ton vector.

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par therwald Voir le message
    un des objets en cours de destruction tente un delete sur une adresse de variable locale ou de paramètre (donc qui provient de la pile)
    Ce serait à priori plutôt ça
    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
    int *foo() {
    	int i;
    	return &i;
    }
     
    int main() {
    	int *p = new int(5);
    	delete p;
    	delete p;	// _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
    			// continuer -> le debug se termine
     
     	delete foo();	// _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
    			// continuer -> ton erreur
    	return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    D'après la doc, tu n'es pas censé avoir à initialiser la taille du vecteur.

    Par contre, ça veut dire qu'OpenCV utilise des types de la STL dans son interface; assure-toi qu'OpenCV est compilée avec exactement la même version de Visual C++, et les mêmes paramètres (Debug vs Release), sinon tu t'exposes à ce genre d'erreurs.

Discussions similaires

  1. Comment utiliser 'vector'?
    Par Ghalloun dans le forum Débuter
    Réponses: 2
    Dernier message: 21/08/2008, 19h00
  2. [débutant] Comment utiliser vector.
    Par miagistevn dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 17/05/2006, 12h58
  3. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  4. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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