Я не совсем уверен, если ваш вопрос о достижении этого, но если вы хотите поведение от shared_ptr
, где, если вы освобождаете значение от одного shared_ptr
, все другие общие указатели к тому же значению станьте nullptr, тогда вы можете поставить unique_ptr
в shared_ptr
для достижения этого поведения.
void print(std::string name, std::shared_ptr<std::unique_ptr<int>>& ptr)
{
if(ptr == nullptr || *ptr == nullptr)
{
std::cout << name << " points to nullptr" << std::endl;
}
else
{
std::cout << name << " points to value " << *(*ptr) << std::endl;
}
}
int main()
{
std::shared_ptr<std::unique_ptr<int>> original;
original = std::make_shared<std::unique_ptr<int>>(std::make_unique<int>(50));
std::shared_ptr<std::unique_ptr<int>> shared_original = original;
std::shared_ptr<std::unique_ptr<int>> thief = nullptr;
print(std::string("original"), original);
print(std::string("shared_original"), shared_original);
print(std::string("thief"), thief);
thief = std::make_shared<std::unique_ptr<int>>(original->release());
print(std::string("original"), original);
print(std::string("shared_original"), shared_original);
print(std::string("thief"), thief);
return 0;
}
Выход:
original points to value 50
shared_original points to value 50
thief points to nullptr
original points to nullptr
shared_original points to nullptr
thief points to value 50
Это поведение позволяет вам совместно использовать ресурс (например, массив), а затем повторно использовать этот ресурс, в то же время аннулируя все общие ссылки на этот ресурс.