2016-09-11 2 views
1
CImg<float>* img = NULL; 
bool loaded; 

while (!loaded) 
{ 
    loaded = true; 
    try 
    { 
     img = &CImg<float>(filename); 
    } 
    catch (CImgException) 
    { 
     loaded = false; 
     fprintf(stdout, "ERROR: could not load %smap file.\n", mapname); 
    } 
} 

Quand j'entre un nom de fichier d'image valide que CImg est capable de trouver et de lire, img.width() et img.height() les deux reviennent -858993460. Selon le documentation, le type de retour img.width() est int, mais la valeur si les extractions est img._width, unsigned int.Pourquoi mon CImg <float> a-t-il une largeur et une hauteur négatives?

+1

Est-ce votre vrai code? Vous ne pouvez pas prendre l'adresse d'un temporaire. – GManNickG

Répondre

0

Comme GManNickG mentionné dans le commentaire, à la ligne img = &CImg<float>(filename); objet temporaire de type CImg<float> créé et vous stocke son adresse dans img variable. Cet objet temporaire est uniquement valable à l'intérieur du bloc:

try 
{ 
    img = &CImg<float>(filename); 
} 

C'est DESTRUCTED lorsque l'exécution quitte ce champ et vous avez pointeur non valide avec un contenu aléatoire (par exemple -858993460 dans le terrain _width).

+0

Si j'utilise 'new' il sera alloué sur le tas, y a-t-il un moyen d'initialiser une instance d'objet et de l'avoir (par exemple) dans la portée à partir de laquelle cette méthode a été appelée? Aucun des amorces sur les pointeurs que j'ai suivis n'a touché à cela. – ophilbinbriscoe

+0

@ophilbinbriscoe 'CImg ' classe a [constructeur de copie] (http://cimg.eu/reference/structcimg__library_1_1CImg.html#aff97beaa34b9061351711dcdaed85c58) et ['move_to'] (http://cimg.eu/reference/structcimg__library_1_1CImg.html # a09aeb03ffe6512209f64b92fbef9574c) méthode. Vous pouvez déclarer 'img' comme' CImg img; 'et affecter simplement' img = CImg (nom de fichier); ' – Nikita