[c++] delete vs delete []
в дебуге наверно ассерт будет из-за того, что размеры выделенного массива и удаляемого не равны
в релизе проканает скорей всего
по стандарту - undefined behaviour
имхо
в релизе проканает скорей всего
по стандарту - undefined behaviour
имхо
проканаетто есть утечки не будет?
насчет ассерта я сильно сомневаюсь.
утечки не будет
а про ассерт - да, проверил в vs2005, действительно нету в коде ассерта
ну да, хуле, в delete размер удаляемого объекта не передается
а про ассерт - да, проверил в vs2005, действительно нету в коде ассерта
ну да, хуле, в delete размер удаляемого объекта не передается
если удаляешь массив - должно быть 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компил g++ под линух
--------------
~A
~A
~A
~A
~A
~A
~A
~A
~A
~A
upd. по поводу утечки - сам подумай, к чему может привести не вызванный дестркутор для почти всех элементов массива. Хотя, для типов типа int, double и т.п. разницы действительно нет. кроме как если кто-то встретит у тебя в коде такое удаление массива - то явно будет от тебя не в востроге 

а причем тут классы и деструкторы?
потому что delete и delete[] на практике различаются только для классов. Так что чтобы объяснить чем они отличаются, полюбому нужны же классы. Для типов результат выполнения будет один и тот же - но тут уже вопрос больше стиля. меня, например, нервирует удаление массива через delete...
не надо уходить от темы.
в теме присутствует char и не интересует как "должно быть".
надо найти ответы на вопросы в первом посте.
в теме присутствует char и не интересует как "должно быть".
надо найти ответы на вопросы в первом посте.
потому что delete и delete[] на практике различаются только для классоввот тут поподробнее.
то есть для char эти два оператора работают эквивалентно? по стандарту?
как насчет такого кода?
какие проблемы будут?
какие проблемы будут?
char* t = new char[5000];
char* s = t + 1;
delete s;
на практике - для delete и delete [] работает один и тотже код
по стандарту - неправильный выбор оператора - undefined behaviour
по стандарту - неправильный выбор оператора - undefined behaviour
какие проблемы будут?песда
ага. спасибо.
все ли компиляторы себе такое позволяют?:)
все ли компиляторы себе такое позволяют?:)
песданадо поискать в мсдн...
проверил в VS2005 ? =)
кокой msdn?
если песда случится, то можно считать, что тебе повезло (если твой код ненарочно пытается освободить память по неверному указателю)
если песда случится, то можно считать, что тебе повезло (если твой код ненарочно пытается освободить память по неверному указателю)
это я так пошутил: хотел поискать слово "песда" в мсдн.
смысл простой: нихуя не понятно, что ты имеешь в виду под этим странным словом. это никак не описывает последствия
будут ли утечки? будет ли исключение?
смысл простой: нихуя не понятно, что ты имеешь в виду под этим странным словом. это никак не описывает последствия

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