Метод reset
Метод reset класса shared_ptr разрывает связь умного указателя с текущим управляемым объектом. Если в момент вызова это был последний владелец, объект уничтожается и память освобождается. Первым параметром метод может принимать новый сырой указатель, которым следует управлять, а вторым - пользовательский удалитель. Оба параметра необязательны: без аргументов reset просто делает указатель пустым.
Синтаксис
ptr.reset()
ptr.reset(new_ptr)
ptr.reset(new_ptr, deleter)
Пример
Давайте создадим shared_ptr на число 1 и посмотрим, что произойдёт после вызова reset без параметров:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> ptr = make_shared<int>(1);
cout << *ptr << endl;
ptr.reset();
if (ptr == nullptr) {
cout << "ptr is empty" << endl;
}
return 0;
}
Результат выполнения кода:
1
"ptr is empty"
Пример
Давайте заменим управляемый объект на новый, передав указатель в reset:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> ptr = make_shared<int>(1);
cout << *ptr << endl;
ptr.reset(new int(2));
cout << *ptr << endl;
return 0;
}
Результат выполнения кода:
1
2
Пример
Давайте убедимся, что при вызове reset объект освобождается только тогда, когда указатель был последним владельцем:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> ptr1 = make_shared<int>(1);
shared_ptr<int> ptr2 = ptr1;
cout << ptr1.use_count() << endl;
ptr1.reset();
cout << ptr2.use_count() << endl;
cout << *ptr2 << endl;
return 0;
}
Результат выполнения кода:
2
1
1
Смотрите также
-
класс
shared_ptr,
который представляет умный указатель с общим владением -
метод
get,
который возвращает сырой указатель -
метод
use_count,
который возвращает количество владельцев -
функция
make_shared,
которая создаёт shared_ptr с новым объектом