Andrey32
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: вопрос некорректен и возникает из-за того, что ты не понял принцип работы с динамически выделяемой памятью... | Принцип работы с динамически выделяемой памятью я понял гораздо лучше, чем вы мой вопрос, хотя я писал по русски. Цитата: ты не можешь, вернее не имеешь право менять значение _самого_ указателя, только читать его и работать с областью памяти, на который он _указывает_, иначе получишь ошибку типа утечки памяти или обычного сбоя программы | Неужели? А если я хочу (и именно так мне нужно) сделать например так: .......................... p++; *p=2; p++; *p=3; и т.д. Вопрос для меня остается. Повторю с уточнением: корректно ли пройдет delete[], если указатель после объявления изменился, например был инкрементирован? Или лучше сделать так: int *p= new int [10]; int *p1 = p;// c p1 будем работать p1++; ........................... ........................ delete [] p; Эту конструкцию я часто использую. Из предосторожности в p сохраняю адрес неизменным для последующего delete, а с p1, адрес в котором изначально равен p, работаю и меняю этот указатель p1. Вопрос мой возник потому, что я предположил, что возможно не стоит делать лишнюю операцию с int *p1 = p и работать напрямую с указателем p. Потому что возможно операция delete "знает", с какого адреса нужно освобождать память, независимо от адреса, который в данный момент в указателе. Это предположение возникло потому, что при выполнении delete[] мы не указываем размер массива. То есть эта размерность где-то хранится и delete[] "знает", что при выполнении, например delete [] p, объявленого как int *p= new int [10] нужно освободить 40 байт памяти (в 32х разрядной системе). Поэтому я предположил также и "знание" не только "сколько", но и "с какого места". Просьба ответить по существу и не рассказывать мне о своих фобиях. | Всего записей: 245 | Зарегистр. 12-12-2006 | Отправлено: 13:46 09-08-2009 | Исправлено: Andrey32, 14:31 09-08-2009 |
|