Да, это может привести к утечке.
Если new std::shared_ptr
выбрасывается, нет ничего, чтобы очистить память, выделенную new int
.
В общем случае автоматические вызовы delete
производятся только тогда, когда конструктор бросает после соответствующего new
.
Для разработки, вы можете переписать код следующим образом:
// if 'new' throws, we just get a bad_alloc, nothing leaked
int *iptr = new int;
// if 'new' throws, nothing will clean up iptr
//
// if, for whatever reason, ctor of std::shared_ptr<int> throws,
// its memory gets reclaimed by an implicit delete, but iptr's target
// is still lost.
auto *ptrptr = new std::shared_ptr<int>(iptr);
// EDIT: If the constructor of shared_ptr fails, it will delete
// the memory it is given, though this still doesn't eliminate the
// leak that can occur if the above `new` fails.
EDIT:
В приведенном выше примере, и это объяснение, действительно имел в виду, чтобы указать, что нет ничего особенного std::shared_ptr
по сравнению с любой другой реализацией интеллектуального указателя или некоторым типом, который принимает указатель как аргумент конструктора.
В последнем случае это действительно зависит от того, что делает конструктор типа с его аргументом. В случае std::shared_ptr
, скорее всего, он не будет генерировать исключение, если ему не удастся выделить контрольный блок (если это фактически то, как оно реализовано).
Если конструктор std::shared_ptr
терпит неудачу, по крайней мере, с реализацией я использую (VS2012), он на самом деле делает удаления памяти она дана.
Каждый раз, когда вы говорите 'new' и не находитесь внутри конструктора умного указателя, у вас есть потенциальная утечка памяти. Просто не говори «новый». –
Итак, будьте осторожны с 'new''s – user1095108
Что говорит Керрек. Кроме того, почему на Земле вы бы выделили 'std :: shared_ptr' динамически? – Angew