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, чтобы он мог разбудить вас.
В любом случае, вам следует задать вопроскачество инструментов, которые производят такой код.