2010-05-17 2 views
2

Я пытаюсь использовать интеллектуальные указатели, такие как auto_ptr, shared_ptr. Однако я не знаю, как использовать его в этой ситуации.Умный указатель C++ для типа без объекта?

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

Я не уверен, но я думаю, что переменная для хранения просто malloc'ed памяти, а не C++ класс объекта. Есть ли способ использовать интеллектуальные указатели для переменной хранения?

спасибо.

+1

Невозможно сообщить, как распределена память, не видя источника 'cvCreateMemStorage'. Это может быть 'malloc'ed, это может быть' new'ed, это может быть не что-либо, возможно, функция 'cvCreateMemStorage' всегда возвращает' NULL'. –

+1

Вы уверены, что 'cvReleaseMemStorage' использует' CvMemStorage **' вместо 'CvMemStorage *'? Это кажется странным. – ereOn

+0

Странно, но [он делает] (http://opencv.willowgarage.com/documentation/dynamic_structures.html#releasememstorage). –

ответ

9

shared_ptr позволяет указать пользовательский дезактиватор. Однако, глядя на документации cvReleaseMemStorage() не имеешь правильную форму (void f(T*)) и вам нужна обертка:

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

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

Также обратите внимание, что эта функция 'shared_ptr' часто недооценивается. Для работы 'auto_ptr' пользователь должен знать, как его выпустить, однако с помощью' auto_ptr' вы указываете, как выпустить во время построения, а затем он скрыт, и пользователю никогда не нужно беспокоиться об этом. И, конечно же, по умолчанию это классический вызов 'delete'. –

1

shared_ptr класса позволяет вам предоставить пользовательские функции удаления/функтора, можно просто обернуть cvReleaseMemStorage функция в функции и обеспечить, что для shared_ptr, а также указатель, который вы хотите, чтобы он работал для вас?

Смежные вопросы