Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: подскажите пожалуйста  (Прочитано 9050 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Lucky
Гость
« : 20-04-2008 17:05 » 

подскажите, пожалуйста
что будет делать такой код :
Код:
int* p = new int[10];
p++;
delete p;
« Последнее редактирование: 20-04-2008 17:19 от Вад » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-04-2008 17:08 » 

Выделит динамически память под массив из 10 int-ов, сдвинет указатель и попробует вызвать деструктор для int по новому значению указателя, имхо. Полагаю, сделает утечку 9*sizeof(int) байт памяти, освободив sizeof(int) байт.
« Последнее редактирование: 20-04-2008 17:10 от Вад » Записан
Lucky
Гость
« Ответ #2 : 20-04-2008 17:44 » 

Цитата
Полагаю, сделает утечку 9*sizeof(int) байт памяти, освободив sizeof(int) байт.

это значит - что delete p; пройдет нормально, и что-то освободится? у меня на VS`05 этот код вылетает, и я не могу понять почему?
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 20-04-2008 18:07 » 

Цитата
Полагаю, сделает утечку 9*sizeof(int) байт памяти, освободив sizeof(int) байт.

это значит - что delete p; пройдет нормально, и что-то освободится? у меня на VS`05 этот код вылетает, и я не могу понять почему?

Код:
int* p = new int[10];
Выделит память на массив типа int, присвоив указателю p адрес первого элемента. Инкременируя адрес этого указателя,-получаешь доступ к следующим элементам массива. Так же обращаться к элементам массива можно через p[0], p[1] ... .

delete p; - освободит указатель от адреса. В BC 3.1 при обращении по этому указателю после освобождения, выдаёт что "Указатель не проинициализирован". Возможно в VS'05 запрещено такое свободное обращение к памяти, или ты далее обращаешься через p к массиву и из-за этого выкидывает.
« Последнее редактирование: 20-04-2008 18:09 от FallenSoul » Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #4 : 20-04-2008 18:07 » 

Он и должен вылететь. Так как диспетчер памяти не находит блока, начинаюшегося с этого метса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 20-04-2008 19:56 » 

Да, согласен, накосячил. Вылетит такой код. Хотя по-прежнему не уверен, что во всех случаях - есть такое чувство, что случалось мне видеть ситуацию, когда похожий код работал (не для int-ов, разумеется), потому и перепутал Улыбаюсь
В любом случае, так делать нельзя Улыбаюсь
Записан
Джон
просто
Администратор

de
Online Online
Пол: Мужской

« Ответ #6 : 21-04-2008 01:15 » 

Всё нормально. В дебаггере если повезёт, то не вылетит. В релизе - 100%.

А вылетает потому, что пытается удалиться кусок памяти, выходящий за пределы выделенного блока.
Те выделяем блок начиная с адреса р размером 10*sizeof(int), потом смещаем начало этого блока на один - р++, потом удаляем 10! элементов - десятый не наш. Ошибка доступа к памяти.

Если дебаггер выделит больше памяти ЗА нашим блоком, то всё будет в порядке - ошибка останется незамеченной. Как избежать такой ошибки? Очень просто - использовать ещё один указатель:

Код:
int* p = new int[10];
int* p1 = p;
// делаем все дальнейшие операции только с р1
p1++;

// а удаляем с начала нашего блока
delete p;

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 21-04-2008 03:14 » 

// а удаляем с начала нашего блока
delete [] p;
Ага
Записан

Джон
просто
Администратор

de
Online Online
Пол: Мужской

« Ответ #8 : 21-04-2008 08:42 » new

copy - paste Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines