Метод swap
Метод swap класса unique_ptr обменивает
содержимое двух умных указателей. После вызова метода
первый указатель начинает владеть объектом, которым
владел второй, и наоборот. При этом сами управляемые
объекты не копируются и не уничтожаются - меняются
только внутренние указатели и информация о владении.
В качестве параметра метод принимает ссылку на другой
объект unique_ptr того же типа.
Синтаксис
ptr1.swap(ptr2)
Пример
Давайте создадим два умных указателя и обменяем их
содержимое с помощью метода swap:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
unique_ptr<int> ptr1(new int(1));
unique_ptr<int> ptr2(new int(2));
cout << "before: " << *ptr1 << " " << *ptr2 << endl;
ptr1.swap(ptr2);
cout << "after: " << *ptr1 << " " << *ptr2 << endl;
return 0;
}
Результат выполнения кода:
"before: 1 2"
"after: 2 1"
Пример
Метод swap удобно использовать для обмена
владельцами объекта между двумя указателями. Давайте
создадим один указатель с объектом, а второй оставим
пустым, а затем обменяем их:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
unique_ptr<int> ptr1(new int(5));
unique_ptr<int> ptr2;
ptr1.swap(ptr2);
if (ptr1 == nullptr) {
cout << "ptr1 is empty" << endl;
}
cout << "ptr2 holds: " << *ptr2 << endl;
return 0;
}
Результат выполнения кода:
"ptr1 is empty"
"ptr2 holds: 5"
Пример
Также можно использовать метод swap для
безопасного освобождения ресурса. Если обменять
указатель с пустым указателем, то объект будет
уничтожен вместе с временным указателем:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
unique_ptr<int> ptr(new int(10));
unique_ptr<int> empty;
ptr.swap(empty);
if (ptr == nullptr) {
cout << "resource released" << endl;
}
return 0;
}
Результат выполнения кода:
"resource released"
Смотрите также
-
класс
unique_ptr,
который представляет умный указатель с уникальным владением -
метод
get,
который возвращает сырой указатель на управляемый объект -
метод
reset,
который заменяет управляемый объект -
метод
release,
который освобождает владение объектом