2010-05-17 5 views
2

J'essaie d'utiliser des pointeurs intelligents tels que auto_ptr, shared_ptr. Cependant, je ne sais pas comment l'utiliser dans cette situation.Pointeur intelligent C++ pour un type de non-objet?

CvMemStorage *storage = cvCreateMemStorage(); 
... use the pointer ... 
cvReleaseMemStorage(&storage); 

Je ne suis pas sûr, mais je pense que la variable de stockage est juste une mémoire malloc, pas un objet de classe C++. Existe-t-il un moyen d'utiliser les pointeurs intelligents pour la variable de stockage?

Merci.

+1

Il est impossible de vous dire comment la mémoire est allouée sans voir la source de 'cvCreateMemStorage'. Il pourrait être 'malloc'ed, il pourrait être' new'ed, il pourrait ne pas être n'importe quoi, peut-être la fonction 'cvCreateMemStorage' retourne toujours' NULL'. –

+1

Êtes-vous sûr que 'cvReleaseMemStorage' prend un' CvMemStorage ** 'au lieu d'un' CvMemStorage * '? Cela semble étrange. – ereOn

+0

Odd en effet, mais [il fait] (http://opencv.willowgarage.com/documentation/dynamic_structures.html#releasememstorage). –

Répondre

9

shared_ptr permet de spécifier un deallocator personnalisé. Cependant, en regardant la documentation cvReleaseMemStorage() ne pas la bonne forme (void f(T*)) et vous avez besoin d'une enveloppe:

void myCvReleaseMemStorage(CvMemStorage* p) { 
    cvReleaseMemStorage(&p); 
} 

shared_ptr<CvMemStorage> sp(cvCreateMemStorage(), &myCvReleaseMemStorage); 
+0

Notez également que cette fonctionnalité de 'shared_ptr' est souvent sous-estimée. Pour que 'auto_ptr' fonctionne, l'utilisateur doit savoir comment le libérer, mais avec' auto_ptr' vous spécifiez comment libérer au moment de la construction, puis il est caché et l'utilisateur n'a jamais à s'en soucier. Et bien sûr, la valeur par défaut est un appel classique 'delete'. –

1

La classe shared_ptr permet pour vous fournir une fonction/foncteur supprimer personnalisée, vous pouvez simplement envelopper le cvReleaseMemStorage fonction dans une fonction et fournir que pour shared_ptr avec le pointeur que vous voulez gérer pour vous?

Questions connexes