delete с [] и без

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

Добрый день!!!

Вот такая маленькая программа
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, но у меня все нормально, память освобождается.
Насколько я понимаю компилятор и без " [] " все понимает, а у кого то были проблемы когда так сделали?
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Проблемы будут если ты удаляешь массив обьектов. деструктор вызовется только для первого элемента если не будет []
sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

А у меня и так все как впрежде

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;

}
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Деструктор - знаешь что такое?
sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

Нет, скажите пожалуйста.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Нельзя удалять массив при помощи delete. Массив в первых байтах хранит свой размер, поэтому ничего катострофического не произойдёт, будет лишь "утеряна" память. Так называемый memory leak. Про такое приложение говорят, что оно "течёт".
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

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

//***********-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 нет. Вчем проблема?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Массив в первых байтах хранит свой размер
Массив хранит свой размер не в первых байтах, а в элементе с индексом [-1], а две формы delete и delete [] используют знание об этом. Таким образом, усли удалить с помощью delete то, что было выделено с помощью new [], то будет утечка памяти. Если наоборот, вызвать delete [] для того, чтобы было выделено через new, то будет краш программы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

Я не понял Romeo -> " если удалить с помощью delete то, что было выделено с помощью new [], то будет утечка памяти ". Что ты понимаеш сказав " утечка памяти ", то есть память не возвращается системе? Если да, то у меня в таком случии утечка памяти нету, просто деструктор вызывается только для 0 элемента массива.
Насколько знаю я при вызове delete происходят два события:
1) вызывается один или несколько деструкторов
2) память возвращается системе
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):Массив хранит свой размер не в первых байтах, а в элементе с индексом [-1]
А это не одно и то же ? Или у тебя -1 элемент массива не в байтах ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Ответить