Умный указатель С++ для необъектного типа?

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

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

Я не уверен, но я думаю, что переменная хранения - это просто распределенная память, а не объект класса С++. Есть ли способ использовать интеллектуальные указатели для переменной хранилища?

Спасибо.


person Brian    schedule 17.05.2010    source источник
comment
Мы никак не можем сказать вам, как распределяется память, не видя источника cvCreateMemStorage. Это может быть malloced, это может быть newed, это может быть ничего, возможно, функция cvCreateMemStorage всегда возвращает NULL.   -  person Dominic Rodger    schedule 17.05.2010
comment
Вы уверены, что cvReleaseMemStorage принимает CvMemStorage** вместо CvMemStorage*? Это кажется странным.   -  person ereOn    schedule 17.05.2010
comment
Действительно странно, но да.   -  person Georg Fritzsche    schedule 17.05.2010
comment
@ereOn: да, это CvMemStorage **, я думаю, что он может установить указатель на NULL после освобождения ресурсов.   -  person Brian    schedule 17.05.2010


Ответы (2)


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

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

shared_ptr<CvMemStorage> sp(cvCreateMemStorage(), &myCvReleaseMemStorage);
person Georg Fritzsche    schedule 17.05.2010
comment
Также обратите внимание, что эту особенность shared_ptr часто недооценивают. Чтобы auto_ptr работал, пользователь должен знать, как его выпустить, однако с auto_ptr вы указываете, как выпустить во время строительства, а затем он скрыт, и пользователю никогда не нужно беспокоиться об этом. И, конечно же, по умолчанию используется классический delete вызов. - person Matthieu M.; 17.05.2010

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

person Jacob    schedule 17.05.2010