std::shared_ptr<T>::~shared_ptr
~shared_ptr(); |
Если *this владеет объектом, и это последний shared_ptr владелец, объект уничтожается с помощью предоставленного делегата.
После уничтожения, умные указатели, которые разделяли владение с *this, если таковые имеются, сообщают об уменьшении счётчика ссылок на use_count(), который на единицу меньше его предыдущего значения.
Примечания
В отличие от std::unique_ptr, делегат std::shared_ptr вызывается даже если управляемый указатель равен null.
Пример
#include <iostream>
#include <memory>
struct S
{
S() { std::cout << "S::S()\n"; }
~S() { std::cout << "S::~S()\n"; }
struct Deleter
{
void operator()(S* s) const
{
std::cout << "S::Deleter()\n";
delete s;
}
};
};
int main()
{
auto sp = std::shared_ptr<S>{new S, S::Deleter{}};
auto use_count = [&sp](char c)
{
std::cout << c << ") use_count(): " << sp.use_count() << '\n';
};
use_count('A');
{
auto sp2 = sp;
use_count('B');
{
auto sp3 = sp;
use_count('C');
}
use_count('D');
}
use_count('E');
// sp.reset();
// use_count('F'); // would print "F) use_count(): 0"
}Вывод:
S::S() A) use_count(): 1 B) use_count(): 2 C) use_count(): 3 D) use_count(): 2 E) use_count(): 1 S::Deleter() S::~S()
См. также
уничтожает weak_ptr (публичный метод std::weak_ptr<T>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/shared_ptr/%7Eshared_ptr