оператор new в С++, надо ли делать delete?

Elina74

если я сделаю нечто вроде
void SomeFunction{
    SomeClass* ptr = new SomeClass(SomeParam1);
    ...
    ptr = new SomeClass(SomeParam2);
    ...
    ptr = new SomeClass(SomeParam3);
    ...
}
нигде не делая delete, это может мне грозить утечкой памяти?
При этом ptr используется только внутри SomeFunction, которая используется несколько раз.

oliver11

Да.

Garryss

Собственно, это и есть классический вариант утечки памяти. Для каждого new должен быть свой delete.

Elina74

Вероятнее всего вы правы.
Но отчего же иногда пишут, что деструкторы вызываются автоматически когда по ходу выполнения программы она выходит за пределы блока, где память была выделена с помощью new?

pitrik2

Но отчего же иногда пишут, что деструкторы вызываются автоматически когда по ходу выполнения программы она выходит за пределы блока, где память была выделена с помощью new?
это пишут или полные дауны или не про Си++
вощем давай ссылку где такое видел

bleyman

Ты всё перепутал.
Деструктор автоматически вызовется если ты напишешь
SomeClass instance1(someParam1);
SomeClass instance2(someParam2);
и так далее.

Elina74

это пишут или полные дауны или не про Си++
вощем давай ссылку где такое видел
походу, я все позабыл, там пишется про область видимости, а про время жизни пишут, что она от точки создания до конца программы или явного его освобождения
А вот, скажите, следующая конструкция безопасна?
SomeClass obj = SomeClass(SomeParam1);
...
obj = SomeClass(SomeParam2);
...
obj = SomeClass(SomeParam3);

kokoc88

А вот, скажите, следующая конструкция безопасна?
std::auto_ptr там будет безопасен. :)

Realist

Да (при условии, что нет косяков в конструкторе/деструкторе).

Elina74

дописал delete в каждом случае

evgen5555

Вероятнее всего вы правы.

Вот это подход!

Realist

Э-э-э
Никакой delete не нужен тебе. Все нормально было.
Если ты работаешь с указателями, тогда new/delete тебе в помощь. Если с самими объектами, тогда ничего тебе не надо.

evolet

тред бредовый до ужаса!
СЗМ!
безграмотные ответы заплюсованы , правильные - заминусованы....
кто-нить объяснит, почему std::auto_ptr здесь не подходит ?
(вообще я не помню точно, но по лигике вещей он должен в операторе копирования удалять объет, если он им владеет)

psihodog

вообще я не помню точно, но по лигике вещей он должен в операторе копирования удалять объет, если он им владеет
:lol:
это называется "так не доставайся же ты никому!"

evolet

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

Elina74

я оставил код с указателями, new и delete

kokoc88

я оставил код с указателями, new и delete
Код стал бы более правильным, и даже немного более коротким, если бы ты написал

#include <memory>
...
std::auto_ptr<SomeClass> pc(new SomeClass);
...
pc = std::auto_ptr<SomeClass>(new SomeClass);
...
pc = std::auto_ptr<SomeClass>(new SomeClass);
Оставить комментарий
Имя или ник:
Комментарий: