2014-07-03 2 views
3

Je souhaite utiliser std::unique_ptr en combinaison avec FITAG de FreeImage. Le code dans la plaine C serait:std :: unique_ptr et pointeur vers le pointeur

... load image; 

FITAG* tag = NULL; 
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &tag); 
... do some stuff with tag; 
FreeImage_DeleteTag(tag); 

... delete image; 

Ma tentative avec unique_ptr:

std::unique_ptr<FITAG, void(*)(FITAG*)> tag(NULL, &FreeImage_DeleteTag); 
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &tag.get()); 

qui revient évidemment:

cannot take the address of an rvalue of type 'pointer' (aka 'FITAG *') 

Comment pourrais-je résoudre ce problème?

Merci beaucoup d'avance.

+1

Non, FreeImage_GetMetadata attend un FITAG **. – user2970139

+1

Si FreeImage_DeleteTag n'a pas de signature acceptée par unique_ptr, alors écrivez une fonction wrapper qui a une signature nécessaire et qui appelle FreeImage_DeleteTag de façon appropriée. – TheUndeadFish

Répondre

7

Inverser l'ordre des opérations; d'abord acquérir la ressource et ensuite construire le unique_ptr.

FITAG *p = NULL; 
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &p); 
std::unique_ptr<FITAG, void(*)(FITAG*)> tag(p, &FreeImage_DeleteTag); 
3
tag.get() 

Ceci renvoie une valeur r. Vous ne pouvez pas obtenir l'adresse d'une valeur r (temporaire). Votre meilleur pari est de le faire à la place:

auto ptr = tag.get(); 
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &ptr); 

Cela vous permettra de passer un FITAG ** dans la fonction. Si vous vouliez passer un FITAG * dans la fonction, supprimez simplement le & puisque tag.get() renvoie le pointeur, pas la valeur.

FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", tag.get()); 
+3

Votre premier exemple sera compilé, mais le 'unique_ptr' ne possèdera plus la ressource allouée par' FreeImage_GetMetadata'. – Praetorian

Questions connexes