delete с [] и без
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 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, но у меня все нормально, память освобождается.
Насколько я понимаю компилятор и без " [] " все понимает, а у кого то были проблемы когда так сделали?
Вот такая маленькая программа
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, но у меня все нормально, память освобождается.
Насколько я понимаю компилятор и без " [] " все понимает, а у кого то были проблемы когда так сделали?
Проблемы будут если ты удаляешь массив обьектов. деструктор вызовется только для первого элемента если не будет []
-
- Сообщения: 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;
}
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;
}
Деструктор - знаешь что такое?
-
- Сообщения: 13
- Зарегистрирован: 16 июн 2009, 23:52
Нет, скажите пожалуйста.
Нельзя удалять массив при помощи delete. Массив в первых байтах хранит свой размер, поэтому ничего катострофического не произойдёт, будет лишь "утеряна" память. Так называемый memory leak. Про такое приложение говорят, что оно "течёт".
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
-
- Сообщения: 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 нет. Вчем проблема?

У меня сейчас другой вопрос
//***********-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
- Откуда: Крым, Севастополь
- Контактная информация:
Массив хранит свой размер не в первых байтах, а в элементе с индексом [-1], а две формы delete и delete [] используют знание об этом. Таким образом, усли удалить с помощью delete то, что было выделено с помощью new [], то будет утечка памяти. Если наоборот, вызвать delete [] для того, чтобы было выделено через new, то будет краш программы." писал(а):Массив в первых байтах хранит свой размер
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 13
- Зарегистрирован: 16 июн 2009, 23:52
Я не понял Romeo -> " если удалить с помощью delete то, что было выделено с помощью new [], то будет утечка памяти ". Что ты понимаеш сказав " утечка памяти ", то есть память не возвращается системе? Если да, то у меня в таком случии утечка памяти нету, просто деструктор вызывается только для 0 элемента массива.
Насколько знаю я при вызове delete происходят два события:
1) вызывается один или несколько деструкторов
2) память возвращается системе
Насколько знаю я при вызове delete происходят два события:
1) вызывается один или несколько деструкторов
2) память возвращается системе
А это не одно и то же ? Или у тебя -1 элемент массива не в байтах ?Romeo писал(а):Массив хранит свой размер не в первых байтах, а в элементе с индексом [-1]
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union