Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2011, 08:58   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Особые ситуации delete

Вот например есть такой участок кода(правильный)
Код:

int* p;

//....

p = new int[10];

// ....

delete[] p;
И такой(неправильный):
Код:
int* p;

// ...

p = new int[10];

// ...

delete p;
Ясно, что в первом случае освобождается память, выделенная для массива из десяти элементов типа int. А вот что именно происходит во втором случае? Освобождается память , где находится первый элемент массива, или вообще ничего?
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.08.2011, 09:42   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
To free an array, you must use delete[]. To free a scalar, you must use delete. If you make a mistake, the results are undefined. Note that the compiler cannot generally help you avoid mistakes because a pointer to a scalar cannot be distinguished from a pointer to an array. (Some libraries are more forgiving of this error than others.)
C++ in a Nutshell, by Ray Lischner

Означает - Х.З.
f.hump вне форума Ответить с цитированием
Старый 12.08.2011, 09:46   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

На практике delete[] нужен, если тебе требуется вызвать деструктор для каждого элемента. Для элементарных типов вроде int достаточно просто delete.
ds.Dante вне форума Ответить с цитированием
Старый 12.08.2011, 10:03   #4
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

во втором случае происходит следующее освобождается только та память на которую в данный момент указывает p а остальные остаются и у тебя будет утечка памяти
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 12.08.2011, 10:25   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

artush1984 Спасибо, это всё, что я хотел знать.
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.08.2011, 17:59   #6
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от artush1984 Посмотреть сообщение
во втором случае происходит следующее освобождается только та память на которую в данный момент указывает p а остальные остаются и у тебя будет утечка памяти
ложь и провокация.

цитата из C++03
Цитата:
In the first alternative (delete object), the value of the operand of delete shall be a pointer
to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause
10). If not, the behavior is undefined. In the second alternative (delete array), the value of the operand of
delete shall be the pointer value which resulted from a previous array new-expression.72) If not, the
behavior is undefined.
статья по теме:
http://habrahabr.ru/company/abbyy/blog/117208/
onewho вне форума Ответить с цитированием
Старый 12.08.2011, 18:29   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну, я вроде под C++'09.
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.08.2011, 18:54   #8
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Ну, я вроде под C++'09.
какой такой 09? 0х же еще не принят.
впрочем вот
http://www.open-std.org/jtc1/sc22/wg21/
ISO/IEC 14882: Programming Language C++ - current draft

5.3.5 Delete П.2
копипаст из С++03
onewho вне форума Ответить с цитированием
Старый 12.08.2011, 19:00   #9
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
какой такой 09? 0х же еще не принят.
09 и 0x немного разные.
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.08.2011, 20:16   #10
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

это ничего не меняет
onewho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти особые элементы матрицы... DarkDeidara Помощь студентам 13 17.10.2011 19:27
Как найти "особые" элементы в матрице? Золушка Паскаль, Turbo Pascal, PascalABC.NET 2 07.04.2011 10:26
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14
двумерный массив, особые элементы Puffy Помощь студентам 2 25.05.2008 10:46