Russian Qt Forum
Ноябрь 23, 2024, 08:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Плюсолюбителям  (Прочитано 43020 раз)
Hrundel
Гость
« Ответ #45 : Март 10, 2015, 18:11 »

А вот откуда delete знает сколько ему удалять я не знаю, подождем ответа более опытных форумчан Подмигивающий

Этим ОСь занимается, она должна следить за удалением из кучи.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #46 : Март 10, 2015, 18:14 »

Этим ОСь занимается, она должна следить за удалением из кучи.
ОС понятия не имеет о куче, кучи может вообще не быть. Подмигивающий
Куча это уровень рантайма стандартной библиотеки.
Записан
Hrundel
Гость
« Ответ #47 : Март 10, 2015, 18:16 »

Все-равно, ось не дает программам написанным на С++ на прямую обращаться к памяти. 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #48 : Март 10, 2015, 18:21 »

Все-равно, ось не дает программам написанным на С++ на прямую обращаться к памяти. 
Используется механизм виртуальной памяти, когда ОС подставляет страницы физической памяти в адресное пространство процесса.
А дальше процесс уже работает с подставленной физической памятью. Процесс не знает, в какую физическую страницу он пишет/читает, ну ему это и не надо.
Записан
AzazelloAV
Гость
« Ответ #49 : Март 14, 2015, 16:00 »

Для себя ничего не уяснил, видно много действительно разных условий.
Если брать DOS, контроллеры, загрузчики - всё, что грузится на голое железо не может не знать о размере выделяемой памяти, не может запрашивать ОС о памяти, т.к. самой оси нету. Менеджеры памяти приложения, о которых говорили - ну это сама программа приложения, глупо говорить что auto_ptr (в данном контексте), является менеджером памяти приложения. Учитывая, что new появился в плюсах задолго до всяких хитрых ОС, значит это было осознанно.

Данную историческую причину я для себя так и не уяснил. Совершенно ясен факт - new выделяет память и спокойно может знать сколько памяти выделено. Эту информацию ему может вернуть сама ОС (дико звучит, что ОС лучше знает, сколько памяти нужно выделить данной операции, ну пусть так, прогнусь под общественное мнение) или компилятор (если на голом железе). Эту информацию можно "зашить" в выделенный указатель для массивов. Все равно эта информация где-то хранится. Да и вообще! Если уж так, с какого перепугу две версии delete существует, просто и delete[].

Опять же, главный вопрос - почему так не сделали.
« Последнее редактирование: Март 14, 2015, 16:12 от AzazelloAV » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #50 : Март 14, 2015, 16:10 »

Если посмотреть ваш первый и последний пост в этой теме, то становиться очевидно, что вы путаете размер и количество элементов массива. Часто они не совпадают.
Записан
AzazelloAV
Гость
« Ответ #51 : Март 14, 2015, 16:17 »

Если посмотреть ваш первый и последний пост в этой теме, то становиться очевидно, что вы путаете размер и количество элементов массива. Часто они не совпадают.

Кол-во элементов и их размер не имеет никакого значения, мы говорим только про размер.
Давайте так, я приведу пример бОльшей абстракции

char * = new[100]
size = 100;
someFunct(char+50,size)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #52 : Март 14, 2015, 16:18 »

Я не знаю кто и для чего так делает.  Улыбающийся
Записан
AzazelloAV
Гость
« Ответ #53 : Март 14, 2015, 16:21 »

Я не знаю кто и для чего так делает.  Улыбающийся

Да не важно, кто и для чего так делает, важно то, что функция это проглотит и не проверит, что памяти меньше, чем нужно
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #54 : Март 14, 2015, 16:25 »

Я не знаю кто и для чего так делает.  Улыбающийся

Да не важно, кто и для чего так делает, важно то, что функция это проглотит и не проверит, что памяти меньше, чем нужно

Поймите, это с++, и его компилятор считает, что у программиста руки прямые и растут из правильного места, и не будет делать такие проверки.
Не пойму, чего рассусоливать эту тему? Улыбающийся
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #55 : Март 14, 2015, 16:26 »

Да не важно, кто и для чего так делает, важно то, что функция это проглотит и не проверит, что памяти меньше, чем нужно
Правильно, проверка входных параметров лежит на программисте и это замечательно. Я сам могу решать, в какой функции стоит проверять параметры, а в какой это избыточно.
Записан
AzazelloAV
Гость
« Ответ #56 : Март 14, 2015, 16:33 »

Цитировать
Поймите, это с++, и его компилятор считает, что у программиста руки прямые и растут из правильного места, и не будет делать такие проверки.
Не пойму, чего рассусоливать эту тему? Улыбающийся

Я рад, что тему в курилку перенесли.
При программирование на плюсах, я не заметил ни одной вещи, которая бы противоречила бы "логике" плюсов. Да, можно выстрелить в ногу, но всему есть объяснений. И чем больше ты их знаешь, тем проще тебе на них писАть. Нету у них мелочей, абсолютно. Все продумано давным давно, всё стройно и красиво. Даже если что-то не так, ты понимаешь, почему это не так и опять всё становится стройно и красиво.

Тут пару лет назад предлагали внести в плюсы property, так народ обосрался, как это мы без get/set будем (хотя само Qt пренебригает префиксом get). А что всего лишь property - аля inline - повышение области видимости.

Ну а почему рассусоливать - ну просто, рассусоливаем, без причины.
« Последнее редактирование: Март 14, 2015, 16:56 от AzazelloAV » Записан
AzazelloAV
Гость
« Ответ #57 : Март 14, 2015, 16:36 »

Да не важно, кто и для чего так делает, важно то, что функция это проглотит и не проверит, что памяти меньше, чем нужно
Правильно, проверка входных параметров лежит на программисте и это замечательно. Я сам могу решать, в какой функции стоит проверять параметры, а в какой это избыточно.

Подойду от обратного.
Совершенно с вами согласен! Но как же программисту получить объём выделенной памяти? Где ТО САМОЕ сравнение перед вызовом функции, которая проверит что памяти не хватит. Опять переменные вводить и синхронизировать их....

Другими словами:
Код:
char * = new[100]
size = 100;
someFunct(char+50,size-50)

Вместо
Код:
char * = new[100]
someFunct(char+50) //функция может проверить, сколько памяти доступно
« Последнее редактирование: Март 14, 2015, 16:47 от AzazelloAV » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #58 : Март 14, 2015, 16:54 »

Если вам нужен размер, то нужно использовать коллекции, которые его сохраняют.
Записан
AzazelloAV
Гость
« Ответ #59 : Март 14, 2015, 17:02 »

Если вам нужен размер, то нужно использовать коллекции, которые его сохраняют.

Мои рассуждения не имеют практической плоскости. Меня интересует "историческая". Так есть, потому что оно так есть, все уже привыкли и считают как должное. Это как предварительная оптимизация, все пишут "++i" и тут понятно, почему так, любой захудалый учебник пишет об этом и все пользуются этим на уровене подсознания. А нету не захудалого учебника, описывающий такое поведение new/delete
Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.