Умные указатели (повышение) объяснил

scoped_ptr - самый простой. Когда он smart-pointers выходит за рамки, он уничтожается. Следующий cpp код является недопустимым boost (scoped_ptrs нельзя копировать), но c++ он проиллюстрирует точку:

std::vector< scoped_ptr > tPtrVec;
{
     scoped_ptr tPtr(new T());
     tPtrVec.push_back(tPtr);
     // raw T* is freed
}
tPtrVec[0]->DoSomething(); // accessing freed memory

shared_ptr - количество cxx ссылок. Каждый раз, когда c++ происходит копирование или c++ присвоение, счетчик ссылок smart-pointers увеличивается. Каждый раз, когда smart-pointers деструктор экземпляра запускается, счетчик c++ ссылок для необработанного cpp T * уменьшается. Когда он smart-pointers равен 0, указатель освобождается.

std::vector< shared_ptr > tPtrVec;
{
     shared_ptr tPtr(new T());
     // This copy to tPtrVec.push_back and ultimately to the vector storage
     // causes the reference count to go from 1->2
     tPtrVec.push_back(tPtr);
     // num references to T goes from 2->1 on the destruction of tPtr
}
tPtrVec[0]->DoSomething(); // raw T* still exists, so this is safe

weak_ptr - это smart-pointers слабая ссылка на общий указатель, которая cxx требует, чтобы вы проверили, находится smart-pointers ли указатель shared_ptr по-прежнему cxx рядом

std::vector< weak_ptr > tPtrVec;
{
     shared_ptr tPtr(new T());
     tPtrVec.push_back(tPtr);
     // num references to T goes from 1->0
}
shared_ptr tPtrAccessed =  tPtrVec[0].lock();
if (tPtrAccessed[0].get() == 0)
{
     cout << "Raw T* was freed, can't access it"
}
else
{
     tPtrVec[0]->DoSomething(); // raw 
}

intrusive_ptr обычно используется, когда cpp необходимо использовать сторонний smart-pointers интеллектуальный ptr. Он smart-pointer вызовет бесплатную функцию smart-pointers для добавления и уменьшения boost счетчика ссылок. Дополнительную smart-pointer информацию см. В link для увеличения cxx документации.

c++

boost

smart-pointers

2022-11-17T21:42:42+00:00