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

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

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

Я же спрашиваю зачем, если размер массива можно вычислить (как делает delete) да ещё умножить на 4 (для 32-х разрядной системы). Тут люд говорит - не важно, может у нас массив больше, да и не с той позиции хотим. Чтож, согласен. Возможен и такой вариант. Но пока не сказал (тот же люд), почему нет проверки на выход за пределы буфера и передаваемым размером.
Трудно вас понимать. Может, вы хотите сказать, что распределяя память по адресу ptr, размер распределенной памяти хранится в системе. И при передаче ptr в функцию, эту информацию можно взять из системы?
Но, во-первых, функция не знает, каким оператором (new или new[]) выделена память, а, во-вторых, память выделяется не байтами, а блоками, с выравниванием. А это уже зависит от платформы и компилятора.
Поэтому somFunc(c+20, 100) - это самострел.

О, извеняюсь что сложно высказываюсь, но вы меня правильно поняли.
То, что память выделяется блоками нас нисколечки не должно волновать. Мало того, что с выравниванием, так ещё и по бланкам 4Кб (если находятся на границе). Но это нас не касается, как и то, что размер файла тоже выравнивается по размеру кластера на винте. Мы же оперируем размером файла, которые нам предоставила ОС.

Но вот вы сказали самострел. Зачем же функция не проверяет этот самострел, когда delete известен этот размер. Не может delete оперировать физическими размерами реальной памяти (как вы знаете, у 32-х разрядных систем 48 разрядная адресcация (46, если быть справедливым)). Но он оперирует виртуальным адресным пространством, а выравнивание на границы 32 происходит на этапе new, а не delete
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Нет никакой архитектуры языка. Все зависит от реализации менеджера памяти в стандартной библиотеке. В языке нет стандартных средств определить размер выделенного блока, да это и не нужно.
Записан
AzazelloAV
Гость
« Ответ #32 : Март 09, 2015, 18:23 »

Нет никакой архитектуры языка. Все зависит от реализации менеджера памяти в стандартной библиотеке. В языке нет стандартных средств определить размер выделенного блока, да это и не нужно.

Так я и про тоже. delete видите ли знает, но никому не говорит. Он что, (этот delete), на марсе живёт, и никто не знает как он устроен? Мы туда (на Марс) запросы шлём. Он оперирует конретными значениями, и говорит конкретные вещи ОС, что данная память свободна. Везде это работает. Какие магические числа передает delete менеджеру памяти, этому черному ящику, что он, только менеджер памяти это знает, но скрывает от нас. Так ли это?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Март 09, 2015, 18:32 »

Так я и про тоже. delete видите ли знает, но никому не говорит. Он что, (этот delete), на марсе живёт, и никто не знает как он устроен? Мы туда (на Марс) запросы шлём. Он оперирует конретными значениями, и говорит конкретные вещи ОС, что данная память свободна. Везде это работает. Какие магические числа передает delete менеджеру памяти, этому черному ящику, что он, только менеджер памяти это знает, но скрывает от нас. Так ли это?
Не нужно смешивать менеджер памяти ядра ОС с менеджером памяти кучи, которым и пользуется рантайм C++ для выделения памяти. Это совершенно разные вещи.
delete может не знать размер блока, это нигде не стандартизованно.
И еще раз, если delete и знает размер, то это размер блока в байтах, а из этого размера нельзя вычислить, сколько объектов находятся в этом блоке.
Записан
AzazelloAV
Гость
« Ответ #34 : Март 09, 2015, 18:43 »

Цитировать
Не нужно смешивать менеджер памяти ядра ОС с менеджером памяти кучи, которым и пользуется рантайм C++ для выделения памяти. Это совершенно разные вещи.
delete может не знать размер блока, это нигде не стандартизованно.
И еще раз, если delete и знает размер, то это размер блока в байтах, а из этого размера нельзя вычислить, сколько объектов находятся в этом блоке.

Я с трудом представляю что такое менеджер памяти кучи, и мне кажется, что его попросту нет.
Также с трудом представляю, что такое менеджер памяти ядра linux, которое, грузится напрямую, без всякого менеджера памяти.
Но то такое, может там и существую какие то дикие "менеджеры", как для винта планировщики, но тогда что они делаю - мне неизвестно.

При чем здесь кол-во блоков. Где передается кол-во блоков, всегда передаётся только размер.
Записан
Bepec
Гость
« Ответ #35 : Март 09, 2015, 18:44 »

Это у вас отсутствует теоритическая база Улыбающийся Бессмысленно разговаривать Веселый
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

При чем здесь кол-во блоков. Где передается кол-во блоков, всегда передаётся только размер.
Ну так в функции вместе с указателем на начало массива, обычно передают количество элементов в массиве, а не размер занимаемой им памяти в байтах.
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #37 : Март 09, 2015, 18:51 »

Нет никакой архитектуры языка. Все зависит от реализации менеджера памяти в стандартной библиотеке. В языке нет стандартных средств определить размер выделенного блока, да это и не нужно.

Я об этом и говорю. Абстрактный delete[] не знает, сколько памяти освобождается. Стандартная библиотека - надстройка, ей можно не пользоваться, пользоваться чем-то еще, а выделять память при помощи new[] и освобождать при помощи delete[], которые являются частью языка, можно в любой программе на С++. Количество элементов для обработки потом придется указать явно, так как средствами С++, если не ошибаюсь, нет возможности выяснить ни размер выделенного блока в байтах, ни количество элементов в массиве.

Пример с дескрипторами - демонстрация, когда указатель хранит не адрес ячейки памяти, а что-то еще. Строго говоря, на абстрактной платформе, под которую может быть написан компилятор С++, указатель может иметь абсолютно любой формат, и может не предоставлять никакой информации о размере массива, на который он (явно или опосредованно) указывает. И delete[] - команда или последовательность команд ASSM - также не будет знать ничего о размере блока, которую выделяли на старте. И, действительно, delete[] это знать не обязательно.
Записан

Эвтаназия - наше хобби!
AzazelloAV
Гость
« Ответ #38 : Март 09, 2015, 19:04 »

Это у вас отсутствует теоритическая база Улыбающийся Бессмысленно разговаривать Веселый

Послушайте. Здесь собрались не ремесленики, а профессионалы и вы в том числе. (Я давно на форуме, пароль забыл, аккаунт новый, хотя часто просто читал). Большинство из делфы перепрыгнуло на Qt, чтобы дальше кодить красиво (так испортить язык низким порогом вхождения). Так что здесь случайных людей нет (не буквально). Большинство из старожил (как и вы) здесь пишут не потому как им нужно что-то, а просто помочь да и вообще..... Таким как вы не нужна помощь, уже давным давно, кто здесь сидит лезут в ответы в исходники, а не на форум и в инет. Вы всё это прекрасно знаете, и все здесь это прекрасно знают. Поделится идеей, найти правильный путь - вот что сейчас есть форум. Не помощь в чём либо, нет (ну кроме заблудьших).

К чему это я? К бессмысленно разговаривать! Если бы я хотел занятся темой "с какого перепугу" delete что-то там, я бы сюда не обращался. Как минимум сам исследовал и с готовыми какими то наработками или понятиями. Но мне по сути это не итересно, так есть, потому что так есть. А вы со своим "Бессмысленно разговаривать" обломили весь кайф. Может вы подумали что я побегу создавать версиию плюсов ISO 15?

К чему вы это сказали?
« Последнее редактирование: Март 09, 2015, 19:08 от AzazelloAV » Записан
Bepec
Гость
« Ответ #39 : Март 09, 2015, 19:14 »

К тому, что с вами бессмысленно разговаривать Улыбающийся Засим умолкаю Веселый
Записан
AzazelloAV
Гость
« Ответ #40 : Март 09, 2015, 19:17 »

К тому, что с вами бессмысленно разговаривать Улыбающийся Засим умолкаю Веселый


Я с вами не соревнуюсь. Но поверьте, это сообщение было лишнее. Так оно противоречит самому себе.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Я тогда сформулирую свой вопрос очень конкретно, без всяких стрельб в ноги - почему функции хотя бы не проверяют выход за рамер буфера?
Потому что язык С разрабатывался как альтернатива ассемблеру. Плюсы вносят свое, но этой базовой позиции не меняют.  Пример
Код
C++ (Qt)
std::vector <char> test(5);
test[10] = 0;
 
Здесь можно добиться исключения по выходу за границы - но ценой использования контейнера. Это "приемлемо", но далеко не бесплатно. В С/C++ программист сам решает идти на эти расходы или нет. Если Вы хотите чтобы это делали за Вас всегда и везде - используйте др язык.

И еще: не очень хорошее название темы. Как-то это звучит вызывающе, да и "любителей" здесь немного. Во всяком случае идеологию и принципы языка все понимают.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #42 : Март 10, 2015, 13:29 »

полагаю, что на delete [] нет стандарта "реализации", а также можно сделать свой delete []
есть наверно еще ответ: " не предусматривалось" )
Записан
Lagovas
Гость
« Ответ #43 : Март 10, 2015, 13:52 »

https://isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

Я с трудом представляю что такое менеджер памяти кучи, и мне кажется, что его попросту нет.
Также с трудом представляю, что такое менеджер памяти ядра linux, которое, грузится напрямую, без всякого менеджера памяти.
Но то такое, может там и существую какие то дикие "менеджеры", как для винта планировщики, но тогда что они делаю - мне неизвестно.
Может тогда стоит разобраться? Раз уж такой интерес к работе с памятью возник Улыбающийся. Ещё есть исходники компиляторов, где можно посмотреть, как работают все эти new и delete.
Записан

Пока сам не сделаешь...
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


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