Страница 1 из 2

delete с [] и без

Добавлено: 20 июн 2009, 14:53
sarturbest
Добрый день!!!

Вот такая маленькая программа
int main()
{
for(int i=0;i<1000000;++i)
{
int* s=new int[1000];
delete s;// вместо delete []s;
}
return 0;
}

Открываю task manger, запускаю программу и смотрю на PF Usage. Все "нормально" PF Usage не изменяется.
Во многих книгах сказано что надо использовать одинаковые формы new и delete, но у меня все нормально, память освобождается.
Насколько я понимаю компилятор и без " [] " все понимает, а у кого то были проблемы когда так сделали?

Re: delete с [] и без

Добавлено: 20 июн 2009, 15:08
Hawk
Проблемы будут если ты удаляешь массив обьектов. деструктор вызовется только для первого элемента если не будет []

Re: delete с [] и без

Добавлено: 20 июн 2009, 15:22
sarturbest
А у меня и так все как впрежде

struct A
{
int a;
int b;
A()
:a(0),b(0)
{}
};

int main()
{
for(int i=0;i<1000000;++i)
{
A* s=new A[1000];
delete s;
}
return 0;

}

Re: delete с [] и без

Добавлено: 20 июн 2009, 15:29
Hawk
Деструктор - знаешь что такое?

Re: delete с [] и без

Добавлено: 20 июн 2009, 15:36
sarturbest
Нет, скажите пожалуйста.

Re: delete с [] и без

Добавлено: 20 июн 2009, 16:31
Airhand
Нельзя удалять массив при помощи delete. Массив в первых байтах хранит свой размер, поэтому ничего катострофического не произойдёт, будет лишь "утеряна" память. Так называемый memory leak. Про такое приложение говорят, что оно "течёт".

Re: delete с [] и без

Добавлено: 20 июн 2009, 18:12
sarturbest
Извините друзья, я только-только все понимаю, и мой исходный вопрос дурацким получилось :(
У меня сейчас другой вопрос

//***********-sample 1-***********\\

struct A
{
int a;
int b;
A()
:a(0),b(0)
{}
~A()
{}
};
int main()
{
A* s=new A[10];
delete s;

return 0;
}

\\***************************//


//**********-sample2-**********\\

struct A
{
int a;
int b;
A()
:a(0),b(0)
{}
/*~A()
{}*/

};
int main()
{
A* s=new A[10];
delete s;

return 0;

}

\\***************************//

В sample 1 у меня дает runtime error а в sample 2 нет. Вчем проблема?

Re: delete с [] и без

Добавлено: 20 июн 2009, 23:24
Romeo
&quot писал(а):Массив в первых байтах хранит свой размер
Массив хранит свой размер не в первых байтах, а в элементе с индексом [-1], а две формы delete и delete [] используют знание об этом. Таким образом, усли удалить с помощью delete то, что было выделено с помощью new [], то будет утечка памяти. Если наоборот, вызвать delete [] для того, чтобы было выделено через new, то будет краш программы.

Re: delete с [] и без

Добавлено: 21 июн 2009, 09:57
sarturbest
Я не понял Romeo -> " если удалить с помощью delete то, что было выделено с помощью new [], то будет утечка памяти ". Что ты понимаеш сказав " утечка памяти ", то есть память не возвращается системе? Если да, то у меня в таком случии утечка памяти нету, просто деструктор вызывается только для 0 элемента массива.
Насколько знаю я при вызове delete происходят два события:
1) вызывается один или несколько деструкторов
2) память возвращается системе

Re: delete с [] и без

Добавлено: 21 июн 2009, 18:23
Airhand
Romeo писал(а):Массив хранит свой размер не в первых байтах, а в элементе с индексом [-1]
А это не одно и то же ? Или у тебя -1 элемент массива не в байтах ?