@Lost_brain

Будет ли утечка памяти при использовании такой конструкции С++?

void foo()
{
    int x = 5;

    MySmartPointer<int> *msp = new MySmartPointer<int>(&x);
}


1) При выходе из функции уничтожится только указатель(msp) или указатель(msp) и все то, что находится по адресу?
2) Вызовет ли рекурсию следующая конструкция:
~MySmartPointer()
{
    delete this;
}

?
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Да, будет утечка, утечет сам объект MySmartPointer, тк его никто не удалит. При выходе из функции уничтожится лишь сам указатель, но не то, куда он указывает.

Не знаю, будет рекурсия или просто креш, надо читать стандарт. Делать так не надо, в этом нет смысла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
нет
кардинально неверное использование деструктора

Деструктор вызывается когда вы уже вызвали удаление объекта delete msp, и призван удалить все что объект проинициализировал но не его самого.

Отличный пример, использование класса для автоматического закрытия файла

class FR
{
  FILE *f;
  public:
  FR(char* name)
  {
    this->f=fopen(name,'r');
  }
  void do()
  {
    // тут работаем с файлом
    // если произойдет проблема, вызываем эксепшн
    throw "The problem";
  }
  ~FR()
  {
    fclose(this->f);
  }
}

void main()
{
  try
  {
    FR fr('test.txt');
    fr.do();
    printf("all ok");
  } catch(const char* msg)
  {
    printf("Error: %s\n",msg);
  }
}

тут голова не болит когда закрывать файл, так как деструктор будет вызван автоматически при окончании жизни объекта
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы