Как правило, если вы используете std::shared_ptr
для указания на объект и хотите создать еще один указатель на этот объект, который не имеет общего владения, вы создадите std::weak_ptr
.
// Create a shared pointer to own the object
std::shared_ptr<int> p = std::make_shared<int>(42);
// Create a weak pointer (that does not own the object)
std::weak_ptr<int> q(p);
// Use the weak pointer some time later
if (std::shared_ptr ptr = q.lock()) {
// use *ptr
}
Мой вопрос: как вы это делаете, когда дело доходит до std::unique_ptr
?
Использование уникального указателя гарантирует, что текущий ресурс принадлежит исключительно самому std::unique_ptr
. Но что, если я хочу создать указатель на тот же ресурс, которому этот ресурс не принадлежит? Я не могу использовать std::weak_ptr
, потому что слабые указатели предназначены для работы со счетчиком ссылок из std::shared_ptr
. Буду ли я просто использовать необработанный указатель здесь? Или есть лучшая альтернатива?
// Create a unique pointer to own the object
std::unique_ptr<int> p = std::make_unique<int>(42);
// Create a non-owning pointer to the same object
// Is this really the best way?
int* q = p.get();
// Use the pointer some time later
if (q != nullptr) {
// Imagine this may be multithreaded...
// what happens if p.reset() is called by another thread while the current thread is RIGHT HERE.
// use *q
}
Единственный способ, которым я могу думать о создании не принадлежащего указателю на объект, принадлежащий std::unique_ptr
, - это использовать необработанный указатель, но, как вы можете видеть из приведенного выше кода, это может вызвать проблемы в многопоточных приложениях. Есть ли лучший способ достичь той же цели?