[c++] delete vs delete []

Maurog

я помню, что был флуд на эту тему, но не могу найти
дайте ссылочку или еще раз пофлудим
будет ли утечка памяти в таком коде (C++)?

char* t = new char[5000];
delete t;

как должно быть по стандарту и как это работает на практике (используя распространенные компиляторы)?

okunek

в дебуге наверно ассерт будет из-за того, что размеры выделенного массива и удаляемого не равны
в релизе проканает скорей всего
по стандарту - undefined behaviour
имхо

Maurog

проканает
то есть утечки не будет?
насчет ассерта я сильно сомневаюсь.

okunek

утечки не будет
а про ассерт - да, проверил в vs2005, действительно нету в коде ассерта
ну да, хуле, в delete размер удаляемого объекта не передается

oleg1331

если удаляешь массив - должно быть delete[]. если просто кусок памяти - delete. По-хорошему, при вызове delete деструктор вызывается только для элемента, на который укзывает указатель. при delete[] - для всех элементов массива.
так что код
#include <iostream>
using namespace std;
class A
{
public:
~A{cout << "~A\n";}
};
int main
{
A *a;
a = new A[3];
delete a;
cout << "--------------\n";
a = new A[10];
delete[] a;
return 0;
}

выведет тебе
~A
--------------
~A
~A
~A
~A
~A
~A
~A
~A
~A
~A
компил g++ под линух

oleg1331

upd. по поводу утечки - сам подумай, к чему может привести не вызванный дестркутор для почти всех элементов массива. Хотя, для типов типа int, double и т.п. разницы действительно нет. кроме как если кто-то встретит у тебя в коде такое удаление массива - то явно будет от тебя не в востроге

okunek

а причем тут классы и деструкторы?

oleg1331

потому что delete и delete[] на практике различаются только для классов. Так что чтобы объяснить чем они отличаются, полюбому нужны же классы. Для типов результат выполнения будет один и тот же - но тут уже вопрос больше стиля. меня, например, нервирует удаление массива через delete...

Maurog

не надо уходить от темы.
в теме присутствует char и не интересует как "должно быть".
надо найти ответы на вопросы в первом посте.

Maurog

потому что delete и delete[] на практике различаются только для классов
вот тут поподробнее.
то есть для char эти два оператора работают эквивалентно? по стандарту?

Maurog

как насчет такого кода?
какие проблемы будут?
 

char* t = new char[5000];
char* s = t + 1;
delete s;

okunek

на практике - для delete и delete [] работает один и тотже код
по стандарту - неправильный выбор оператора - undefined behaviour

okunek

какие проблемы будут?
песда

Maurog

ага. спасибо.
все ли компиляторы себе такое позволяют?:)

Maurog

песда
надо поискать в мсдн...
проверил в VS2005 ? =)

okunek

кокой msdn?
если песда случится, то можно считать, что тебе повезло (если твой код ненарочно пытается освободить память по неверному указателю)

Maurog

это я так пошутил: хотел поискать слово "песда" в мсдн.
смысл простой: нихуя не понятно, что ты имеешь в виду под этим странным словом. это никак не описывает последствия
будут ли утечки? будет ли исключение?

okunek

по стандарту, поведение такого кода неопределено, т.е. может случится что угодно
по факту (vs2005) будет утечка и будет ассерт

Maurog

гуд)
Оставить комментарий
Имя или ник:
Комментарий: