Можно ли создать слабый указатель для указателя стиля c или необработанный указатель в c ++ 17 - PullRequest
0 голосов
/ 09 января 2019

У меня есть сторонняя библиотека с большим количеством необработанных указателей в стиле c. Сейчас я пишу поток на c ++ 17. Я хочу использовать слабый указатель для указателей стиля c библиотеки. эта библиотека может использоваться многими другими потоками, которые изменяют / удаляют те же самые указатели. как это может быть достигнуто? Есть ли шаблон дизайна, который может помочь?

В библиотеке:

struct table *table = (struct table *) malloc(sizeof(table));

Сейчас в моей теме:

auto wp = std::make_weak<struct table* >(table)

1 Ответ

0 голосов
/ 09 января 2019

Одна из фатальных проблем с необработанными указателями в том, что ничего вы не можете сделать, чтобы заметить, что где-то еще лишил законной силы ваш указатель. Умные указатели работают, отслеживая, кто знает об объекте, и уничтожая только когда последний указатель уничтожен.

std::weak_ptr является дополнением к std::shared_ptr и ничего больше. Он волшебным образом не знает, когда delete вызывается для объекта, на который он указывает, он использует тот же механизм, который std::shared_ptr делает, чтобы узнать о времени жизни объекта. Обратите внимание, что нет конструктора std::weak_ptr, который принимает необработанный указатель.

Если библиотека управляет владельцем, то неверно для вас, чтобы поместить их в интеллектуальный указатель, который использует std::default_delete. Лучшее, что вы можете сделать, - это использовать функцию release библиотеки как средство удаления ваших умных указателей и обернуть функцию create, чтобы вы возвращали такой умный указатель вместо необработанного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...