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, Супермодераторы



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

Сейчас этот форум просматривают: granit201z


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

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