Рубрики

Умные указатели в C ++

Рассмотрим следующий простой код C ++ с обычными указателями.

MyClass *ptr = new MyClass();

ptr->doSomething();
// Мы должны удалить (ptr), чтобы избежать утечки памяти

Используя умные указатели , мы можем заставить указатели работать так, чтобы нам не нужно было явно вызывать delete. Интеллектуальный указатель — это класс-оболочка для указателя с перегруженными операторами типа * и ->. Объекты класса Smart Указатель выглядят как указатель, но могут делать много вещей, которые обычному указателю не нравятся автоматическое уничтожение (да, нам не нужно явно использовать удаление), подсчет ссылок и многое другое.
Идея состоит в том, чтобы создать класс с указателем, деструктором и перегруженными операторами, такими как * и ->. Поскольку деструктор автоматически вызывается, когда объект выходит из области видимости, динамически выделенная память автоматически удаляется (или счетчик ссылок может быть уменьшен). Рассмотрим следующий простой класс smartPtr.

#include<iostream>

using namespace std;

  

class SmartPtr

{

   int *ptr;  // Фактический указатель

public:

   // Конструктор: см. Https://www.geeksforgeeks.org/g-fact-93/amp/

   // для использования явного ключевого слова

   explicit SmartPtr(int *p = NULL) { ptr = p; } 

  

   // Деструктор

   ~SmartPtr() { delete(ptr); }  

  

   // Перегрузка оператора разыменования

   int &operator *() {  return *ptr; }

};

  

int main()

{

    SmartPtr ptr(new int());

    *ptr = 20;

    cout << *ptr;

  

    // Нам не нужно вызывать delete ptr: когда объект

    // ptr выходит из области видимости, деструктор для него автоматически

    // вызывается и деструктор действительно удаляет ptr.

  

    return 0;

}

Выход:

20

Можем ли мы написать один класс интеллектуальных указателей, который работает для всех типов?
Да, мы можем использовать шаблоны для написания универсального класса интеллектуальных указателей. Следующий код C ++ демонстрирует то же самое.

#include<iostream>

using namespace std;

  
// Универсальный класс интеллектуальных указателей

template <class T>

class SmartPtr

{

   T *ptr;  // Фактический указатель

public:

   // Конструктор

   explicit SmartPtr(T *p = NULL) { ptr = p; }

  

   // Деструктор

   ~SmartPtr() { delete(ptr); }

  

   // Перегрузка оператора разыменования

   T & operator * () {  return *ptr; }

  

   // Перекрывающий оператор стрелки, так что члены T могут быть доступны

   // как указатель (полезно, если T представляет класс или структуру или

   // тип объединения)

   T * operator -> () { return ptr; }

};

  

int main()

{

    SmartPtr<int> ptr(new int());

    *ptr = 20;

    cout << *ptr;

    return 0;

}

Выход:

20

Умные указатели также полезны для управления ресурсами, такими как файловые дескрипторы или сетевые сокеты.

Библиотеки C ++ предоставляют реализации интеллектуальных указателей в форме auto_ptr , unique_ptr , shared_ptr и weak_ptr

Ссылки:
http://en.wikipedia.org/wiki/Smart_pointer

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Умные указатели в C ++

0.00 (0%) 0 votes