#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>
. Что довольно некрасиво, но справится с задачей.