Использование shared_ptr с abject, который является typedef из void*

#c #pointers #smart-pointers

#c #указатели #интеллектуальные указатели

Вопрос:

Я сталкиваюсь с некоторыми проблемами при переносе некоторого кода, который использует интеллектуальные указатели.

Старый код..

 shared_ptr<Foo> create_Foo();
 

Где Foo внутренне создается с помощью функции

 Foo* Foo::FooFactory;
 

Итак, я понимаю, что мы создаем Ptr для класса / объекта C , а затем передаем этот ptr в общий объект Ptr, чтобы создать общий ptr, который содержит ptr для объекта типа Foo …

Но что происходит, когда я хочу создать интеллектуальный ptr для хранения объекта, который определяется как объект, образующий void *?

Например.

 typdef void* FOO_HANDLE
shared_ptr<FOO_HANDLE> create_foo();
 

С внутренней фабричной функцией, подобной

 FOO_HANDLE FooFactory();
 

По сути, я не понимаю, как объявить и создать объект shared_ptr с объектом typedef FOO_HANDLE, который по сути является void *!
Кроме того, поскольку FOO_HANDLE является ptr для объекта C, он уничтожается с помощью метода уничтожения ala,

 FooDestory(FOO_HANDLE);
 

Поэтому, я думаю, мне также нужно сообщить smart_prt о методе удаления объекта.

Я начинаю думать, что использование smart ptr здесь — неправильный подход.. но подумал, что сначала я спрошу здесь…

  • джеймс

Комментарии:

1. Вводятся интеллектуальные указатели, точка.

2. Вы можете предоставить интеллектуальные указатели с пользовательскими удалителями. Кроме unique_ptr того, предпочтительнее shared_ptr

Ответ №1:

A std::shared_ptr<void> может содержать a void* . Когда вы создаете такое shared_ptr , вам необходимо предоставить deleter , который будет удален по типу (и, следовательно, не является частью самого shared_ptr типа). Вы можете сделать это:

 shared_ptr<void> create_foo() {
    return {FooFactory(), FooDestroy};
}
 

Комментарии:

1. …за исключением того, что это должно быть shared_ptr<void> или shared_ptr<*FOO_HANDLE> . Что довольно некрасиво, но справится с задачей.