Указатель на умный указатель, цель - PullRequest
0 голосов
/ 19 сентября 2018

Может кто-нибудь объяснить, как это работает.

shared_ptr<T> *p = new shared_ptr<T>(x);

Должен ли я сделать delete p; p = NULL;

Спасибо

1 Ответ

0 голосов
/ 24 сентября 2018
shared_ptr<T> *p = new shared_ptr<T>(x);

Это крайне не идиоматично, не рекомендуется, не очень хороший дизайн.

shared_ptr<T> для автоматического управления памятью: вам не нужно delete объект, управляемый shared_ptr.Необходимо убедиться, что

  • x указывает на объект T, выделенный с помощью new
  • , никакой другой код не пытается освободить x

По какой-то причине код выделяет shared_ptr с new: автоматический инструмент управления памятью (shared_ptr) управляется вручную здесь: вы должны запомнитьdelete shared_ptr, когда вам не нужно it (и не раньше), "it" - инструмент, единственная цель которого состоит в том, чтобы избежать риска забытьудалить или сделать это слишком рано.

Должен ли я сделать delete p; p = NULL;

Да, вам нужно delete p; и p = NULL; необязательно, но необходимо, если другой кодвозможно, потребуется проверить, указывает ли p на объект.

Аналогия будет иметь будильник, чтобы разбудить вас, установить будильник в момент времени T, вынуть батарею из часов, затем спроситьдруг, чтобы положить батарею обратно в будильник в момент времени T, чтобы он мог разбудить вас.

В любом случае, вам следует задать вопроскачество инструментов, которые производят такой код.

...