Умные указатели (повышение) объяснил
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
Умные указатели (повышение) объяснил
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.