Shared Ptr в С++: избавляйтесь от проблем утечек памяти
Shared ptr - это умный указатель на объект, который поддерживает счетчик ссылок на данный объект. Это означает, что когда существует несколько shared ptr на один и тот же объект, счетчик ссылок увеличивается, а когда shared ptr удаляется, счетчик ссылок уменьшается. Если счетчик ссылок достигает нуля, объект автоматически удаляется.
Использование shared ptr позволяет избежать проблем с утечками памяти, которые могут возникнуть при использовании обычных указателей. Также shared ptr позволяет безопасно использовать объекты в многопоточной среде, где несколько потоков могут с ним работать одновременно.
Ниже приведен пример использования shared ptr:
cpp
#include
#include
class MyClass {
public:
MyClass(int x) : m_x(x) {
std::cout << "MyClass constructor called" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called" << std::endl;
}
void print() {
std::cout << "m_x = " << m_x << std::endl;
}
private:
int m_x;
};
int main() {
std::shared_ptr ptr1(new MyClass(10));
std::shared_ptr ptr2(ptr1);
std::shared_ptr ptr3(new MyClass(20));
ptr1->print(); // output: m_x = 10
ptr2->print(); // output: m_x = 10
ptr3->print(); // output: m_x = 20
std::cout << "Number of shared ptr to ptr1: " << ptr1.use_count() << std::endl; // output: Number of shared ptr to ptr1: 2
ptr1.reset(); // decreases reference count
ptr2.reset(); // decreases reference count
std::cout << "Number of shared ptr to ptr3: " << ptr3.use_count() << std::endl; // output: Number of shared ptr to ptr3: 1
return 0;
}
В данном примере создаются три shared ptr на два разных объекта MyClass. Когда создается ptr2, счетчик ссылок на объект MyClass увеличивается. Когда ptr1 и ptr2 удаляются с помощью функции reset(), счетчик ссылок на объект MyClass уменьшается. Когда ptr3 удаляется из-за выхода из области видимости, счетчик ссылок достигает нуля, и объект MyClass удаляется. В выводе на консоль мы можем наблюдать порядок вызова конструкторов и деструкторов объектов MyClass.