Потому что удаляется отдельный объект, а не массив объектов.
Вообще, операторы new[] / delete[] используются для создания / удаления массивов объектов;
операторы new и delete используются для создания / удаления отдельных объектов.
V>и в какой то программе, в примерах по программированию, я видел тоже массив указателей на массивы типа char, V>и все это удалялось так:
V>
V>char** parr=NULL;
V>parr = new char* [10];
V>for(n=0;n<10;n++)
V>{
V> parr[n] = new char [100];
V>}
V>delete parr;
V>
V>удалится ли вся память таким образом?
В этом примере создается массив указателей типа char*, состоящий из 10 элементов.
На каждой итерации цикла создается массив из 100 элементов типа char, и адрес первого (с индексом 0) элемента в массиве присваивается
элементу массива parr.
Здесь с удалением две проблемы:
1) Не удаляется память, которая выделялась в цикле — утечка памяти в 10 массивов * 100 элементов = 1000 элементов типа char.
2) Для освобождения памяти, на которую указывает указатель par, используется неправильный оператор — delete, а не delete[],
как должно быть. То есть память, выделенная под массив, освобождается как память, выделенная под один
элемент массива — одиночный объект. Это является неопределенным поведением (undefined behaviour, UB), т.е.
в данном случае может произойти повреждение памяти со всеми вытекающими последствиями.
Чтобы упростить себе жизнь, лучше использовать стандартный контейнер из STL std::vector.
С его использованием твой первоначальный пример будет выглядеть так:
#include <vector>
struct CStruct {
int i;
CString Caption;
};
int main ()
{
std::vector<CStruct> st (10);
size_t count = st.size ();
for (size_t i = 0; i < count; ++i)
{
st[i].i = 2;
st[i].Caption = "22";
}
return 0;
}
В данном случае после завершения функции main вся выделенная память автоматически будет освобождена деструкторм класса std::vector.
Здравствуйте, programmater, Вы писали:
P>без всяких там глупых [], и никогда никаких проблем или утечек памяти отродясь не было? Я что, получается написал гору бесполезного кода?
Ну, не бесполезного. А с УБ. А частный случай УБ -- правильно работающая программа.. Советую переписать от греха подальше -- сменишь компилятор, а то и платформу -- и будешь потом неделю багу искать...
P>Интересно, а почему я всю жысь выделяю память используя
Да потому что везло. Потому что operator new[]() и operator new() в MS Visual Studio традиционно возвращают совместимые результаты. Попробуй чуть более другой компилятор — и тебя будут ждать неприятные сюрпризы...
И вообще — вызов delete[] ручками — это прошлый век, используй std::vector как завещал Саттер
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
new / delete
От:
Аноним
Дата:
13.03.06 07:38
Оценка:
Извиняюсь за такой глупый вопрос. Есть структура, есть массив указателей на структуру. Я заполняю массив в начале программы.
Здравствуйте, Аноним, Вы писали:
А>Извиняюсь за такой глупый вопрос. Есть структура, есть массив указателей на структуру. Я заполняю массив в начале программы. А>
хм, интересно
почему не delete [] ?
и в какой то программе, в примерах по программированию, я видел тоже массив указателей на массивы типа char,
и все это удалялось так:
char** parr=NULL;
parr = new char* [10];
for(n=0;n<10;n++)
{
parr[n] = new char [100];
}
delete parr;
а потому что он new [] не вызавал.
V>и в какой то программе, в примерах по программированию, я видел тоже массив указателей на массивы типа char, V>и все это удалялось так:
V>
V>char** parr=NULL;
V>parr = new char* [10];
V>for(n=0;n<10;n++)
V>{
V> parr[n] = new char [100];
V>}
V>delete parr;
V>
Здравствуйте, night beast, Вы писали:
NB>нет. не удалится. надо
NB>for(n=0;n<10;n++) { delete [] parr[n]; } NB>delete [] parr;
NB>принцып простой — каждому new (new[]) свой delete (delete []).
Интересно, а почему я всю жысь выделяю память используя
char* MyPtr = new char[n]; // (char - это к примеру, может быть int, short, double...)
а удаляю всегда
delete MyPtr;
без всяких там глупых [], и никогда никаких проблем или утечек памяти отродясь не было? Я что, получается написал гору бесполезного кода?
Здравствуйте, programmater, Вы писали:
P>Здравствуйте, night beast, Вы писали:
NB>>нет. не удалится. надо
NB>>for(n=0;n<10;n++) { delete [] parr[n]; } NB>>delete [] parr;
NB>>принцып простой — каждому new (new[]) свой delete (delete []).
P>Интересно, а почему я всю жысь выделяю память используя
P>
P>char* MyPtr = new char[n]; // (char - это к примеру, может быть int, short, double...)
P>
P> а удаляю всегда
P>
P>delete MyPtr;
P>
не те книжки читал?
P>без всяких там глупых [], и никогда никаких проблем или утечек памяти отродясь не было? Я что, получается написал гору бесполезного кода?
ну, если есть бинарники, и они приносят пользу, то не бесполезного...