2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Динамический массив с/с++
Сообщение20.11.2013, 21:56 


26/11/11
134
Разбирая такую занимательную штуку, как динамический массив, задался вопросом "А что, если я использую больше памяти, чем выделю?" и написал следующий мини код
Код:
int *mas = new int[10];
for(int i=0; i<12; i++)
{
        mas[i]=i;
}
ShowMessage(mas[11]);


Самое забавное то, что программа адекватно выдала число 11. И у меня возник вопрос. Зачем выделять больше памяти, если можно дальше заполнять? Или я что-то не так понимаю?

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение20.11.2013, 22:21 
Заслуженный участник


27/04/09
28128
Позаполняли, значит, пользуясь халатностью языка; потом выделили новую память. Система случайным образом решила над вами пошутить и выдала кусок вплотную прилегающий к предыдущему. Дальше вы начинаете изменять его, потом возвращаетесь к первому (или в другом порядке)…

    О что за чёрт?! :shock: Откуда взялось это число 4242?

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 07:23 


26/11/11
134
arseniiv в сообщении #790879 писал(а):
Позаполняли, значит, пользуясь халатностью языка; потом выделили новую память. Система случайным образом решила над вами пошутить и выдала кусок вплотную прилегающий к предыдущему. Дальше вы начинаете изменять его, потом возвращаетесь к первому (или в другом порядке)…

    О что за чёрт?! :shock: Откуда взялось это число 4242?

т.е то, что мне выдало 11, это просто удача?)

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 07:31 
Заслуженный участник


16/02/13
4214
Владивосток
Именно.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 20:48 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Даже не просто удача. Система на самом деле не выдаёт куски памяти вплотную. Она выдаёт куски памяти, перемежая их служебной информацией. И если вы запишете что-то поверх этой информации, будет очень-очень плохо. Если не сразу, то потом, когда система попытается этой информацией воспользоваться (например, выделить ещё один кусок памяти, или освободить его). Типичный результат - Segmentation Fault и прекращение программы.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 21:19 
Заслуженный участник


09/09/10
3729
Мечтаю о компиляторе с "параноидальным" режимом — когда все неиспользуемые страницы памяти будут помечаться PAGE_NOACCESS, а все обращения к используемым страницам перехватываться и проверяться на предмет легальности. Да вообще, что мелочиться — чтобы в этом режиме любая языковая конструкция с UB обнаруживалась и приводила к немедленному падению. Интересно, сколько программ/библиотек будет работать корректно после компиляции таким компилятором? Где-то процентов 5 от общего числа? Больше? Меньше?

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 22:08 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Joker_vD в сообщении #791166 писал(а):
все обращения к используемым страницам перехватываться и проверяться на предмет легальности.
http://duma.sourceforge.net/ ?

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 23:18 
Заслуженный участник


16/02/13
4214
Владивосток
Зачем же мечтать? Разнообразных примочек к ++ для контроля обращений к массивам таки немеряно. Есть и средствами языка — использование классов, проверяющих границы индексов, — и библиотек — скажем, подменяющих malloc, так что выделяется память, прижатая справа к странице, и обращение к следующему, несуществующему элементу приводит к падению.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение21.11.2013, 23:34 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Joker_vD в сообщении #791166 писал(а):
Мечтаю о компиляторе с "параноидальным" режимом

Чего мечтать - отладочные режимы существующи компиляторов примерно так и устроены.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение22.11.2013, 01:37 
Заслуженный участник


09/09/10
3729
Вы как-то заострили внимание на памяти. Я же больше недоволен отсутствием надежных методов отлова undefined behaviour — к примеру, чтобы int my__var = 1; не компилировалось.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение22.11.2013, 01:48 
Заслуженный участник


16/02/13
4214
Владивосток
Joker_vD в сообщении #791274 писал(а):
Вы как-то заострили внимание на памяти
О как. Это мы, оказывается, заострили внимание на памяти.
Joker_vD в сообщении #791274 писал(а):
Я же больше недоволен отсутствием надежных методов отлова undefined behaviour
Ну да, отладка — тема вообще больная.
Joker_vD в сообщении #791274 писал(а):
чтобы int my__var = 1; не компилировалось
Мнэээ... А этот безобидный на вид оператор чем вам не угодил, если не секрет?

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение22.11.2013, 01:58 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Joker_vD в сообщении #791274 писал(а):
к примеру, чтобы int my__var = 1; не компилировалось.
А почему не должно? Я помню, что идентификаторы, начинающиеся с двух подчеркиваний или с подчеркивания и большой буквы, зарезервированы, а тут в чем проблема?

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение22.11.2013, 02:08 


05/09/12
2587
Не знаю, что имел в виду автор примера, но я наступал на грабли signed по умолчанию (когда я рассчитывал на unsigned), а если еще разное количество байт (платформозависимость) типа int вспомнить, то сразу захочется определять типы максимально однозначно.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение22.11.2013, 02:13 
Заслуженный участник
Аватара пользователя


06/10/08
6422
_Ivana в сообщении #791277 писал(а):
Не знаю, что имел в виду автор примера, но я наступал на грабли signed по умолчанию (когда я рассчитывал на unsigned), а если еще разное количество байт (платформозависимость) типа int вспомнить, то сразу захочется определять типы максимально однозначно.
Мысль, безусловно, правильная, но к примеру отношения не имеет, потому что константа 1 определенно имеет тип int.

 Профиль  
                  
 
 Re: Динамический массив с/с++
Сообщение22.11.2013, 02:49 
Заслуженный участник


16/02/13
4214
Владивосток
Строго говоря, типа int не существует. Есть signed int, есть unsigned int. Тип единицы — это факт её личной биографии; тип переменной и правда непонятен... Впрочем, как понимаю, в ++ никто не мешает определить свои типы sint, uint и запретить int.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group