Custom deleter. Smart pointer std::unique_ptr();

188
21 февраля 2019, 05:10

Не очень могу понять, что происходит в этом коде. Нужно создать свой deleter, для умного указателя. В итоге нашел этот код, как ответ на stackoverflow, но он не работает для меня.

Есть две функции в области видимости файла:

Widget* create()
{
  return new Widget();
}
void destroy(Widget* wid)
{
  cout << "I'm inside of deleter" << endl;
  delete wid;
}

И сам класс Widget:

class Widget
{
public:
std::unique_ptr<Widget, void(*)(Widget*)> ptr_;
Widget() : ptr_(create(), destroy)
{
}
~Widget()
{
    cout << "Widget destructor called! Memory deallocated." << endl;
}
};

1) Как теперь этим пользоваться?

2) Что это за конструкция void(*)(Widget*)?

3) Как понять такой конструктор Widget() : ptr_(create(), destroy)?

Answer 1
  1. Странный вопрос. Зачем-то же вы этот код искали? Получается примерно - как обращение к доктору: я тут нашел какие-то таблетки, как их принимать? Доктор может сказать дозировку, но вы уверены в наличии болезни? :)

  2. Тип, представляющий собой указатель на функцию, принимающую параметр Widget* и возвращающую void.

  3. Конструктор с пустым телом {}, инициализирующий поле ptr_ путем вызова соответствующего конструктора (в данном случае - конструктора для std::unique_ptr<Widget, void(*)(Widget*)>, с передачей ему в качестве аргументов результата вызова create() и указателя на функцию destroy.

P.S. Чтобы правильно задать вопрос, нужно знать половину ответа. (с) Шекли

READ ALSO
Как в cmake подключить библиотеку libpqxx?

Как в cmake подключить библиотеку libpqxx?

Как в cmake подключить библиотеку libpqxx?

233
Аналог параллельного цикла из openmp

Аналог параллельного цикла из openmp

Есть ли аналог для #pragma omp parallel for из openmp в текущем c++ стандарте?

206
QT MYSQL QThread

QT MYSQL QThread

У меня есть два класса: checkMessage унаследованный от QThread и основной класс-форма mainwindow унаследованный от QWidgetВ первом классе раз в несколько секунд...

179
(VS2010) error LNK2005 + fatal error LNK1169: one or more multiply defined symbols found

(VS2010) error LNK2005 + fatal error LNK1169: one or more multiply defined symbols found

1>lab_2obj : error LNK2005: _DllMain@12 already defined in dllmain

204