![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
Доброе Утро.Какой можно выставить макс объем памяти для malloc() или же new .
У меня что то ругается char *p = (char*)malloc(5000000); |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
как это понимать? выставить где, в ОС ? а это как понимать? кто ругается? как ругается? |
|||
|
||||
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
да в ОС. ругается сюда malloc.c
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
в настройках проекта указывается - параметр Max Heap Size
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вы ничего не напутали? ![]() наверное, стОило бы упомянуть о самой ОС ![]() |
|||
|
||||
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
Win 7 pro.ultimate
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
никак. потому-что это не ОС ругается, а ваш компилятор(похоже на микрософт). ОС вообще-то, глубоко насрать до того, сколько вы собираетесь выделить. но если у ОС не окажется столько свободной памяти, она вам вернет 0. Это сообщение отредактировал(а) boostcoder - 21.10.2010, 10:23 |
|||
|
||||
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
Если это компилятор то как увеличить размер памяти?
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а это уже вопрос к виндузятникам. Добавлено через 42 секунды ну и может поясните, какое сообщение вы получаете, и что в нем говорится? |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
вот тут например
![]() -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
||||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
не знаю в каждом компиляторе по разному
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
HeapAlloc, VirtualAlloc, VirtualAllocEx
MapViewOfFile(минимальная нагрузка на память ) |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
говорит о ошибке в рантайм. при чем тут компилятор? |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
может действительно ошибка не в выделении памяти а при работе с этой выделенной памятью
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Dem_max, еще как вариант, ошибка может возникать при выделении памяти. но к примеру, память ужасно фрагментирована, и нет непрерывного блока требуемого размера.
можно попробовать запустить программу после ребута системы. |
|||
|
||||
Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 2 Всего: 14 |
||||
|
||||
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
Проблема вызывала memcpy(...). Неправильные циклы для данных.
Все решено.Дело закрыто.Malloc() непричем |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
boostcoder, "сильная фрагментация" физической памяти никак не может привести к невозможности выделить большой непрерывный кусок виртуальной - она просто будет соткана из множества фрагментов, но предоставлена приложению в виде непрерывного блока.
А еще на разных операционных системах malloc может вести себя по-разному. Например в линупсе по умолчанию память выделяется "лениво", т.е. может быть выделено стопицот мегабайт, а уже при их использовании обнаружится, что память кончилась везде, в т.ч. в свопе, в таком случае за свою грязную работу возьмется ООМкиллер и настучит кому-нибудь по башке. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. вы хотите сказать, что при malloc()`е операционка начнет дефрагментировать память? звучит нелепо. честно. |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Я хочу сказать, что физическая память в компе фрагментирована _всегда_. Запустили программу, за ней вторую, первая закончила работу - дырка в памяти, получите и распишитесь. Это тривиальный пример, понятно, что куча программ все время выделяют и отпускают куски памяти - это по возможности оптимизируется ОС и libc, например во время free память уже освобождается, но остается привилегированной для этой рпограммы, но в конечном счете от фрагментаци один фиг никуда не деться.
Это не нелепо, по-другому только либо мега тормоза при онлайн-дефрагментировании памяти, либо крайне неэффективное использование ОЗУ системы. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это все понятно.
я лишь хотел сказать то, что свободной памяти в реале может быть больше чем ты хочешь выделить одним куском. но т.к. он фрагментирована, ты получишь NULL. |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Не получу я NULL! Потому что, во-первых ленивое выделение памяти, во-вторых своп, в-третьих еще до свопа, при необходимости выделения большого куска виртуальной памяти, совокупном наличии этого места в ОЗУ и отсутствии цельного куска в физическом адресном пространстве ОЗУ, выделенная единым виртуальным куском память физически размажется по всем планкам памяти.
Но! Отчасти вы правы в том смысле, что (при сраничной организации памяти) теоретически может статься так, что очень многие страницы будут заполнены всего по несколько байт - тогда и правда тютю. Но на практике это осуществимо лишь при запуске миллионов процессов. Т.е. никогда :). -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
>Но на практике это осуществимо лишь при запуске миллионов процессов.
не совсем ![]() в Windows память выделяется (HeapAlloc) внутри блока, предварительно зарезервированного посредством HeapCreate. в Linux (внутри kmalloc) возможны различные распределители памяти. Например, использование slab аналогично HeapCreate/HeapAlloc. Все это (немного условно) работает поверх менеджера виртуальной памяти. Ну а поскольку между виртуальной плоской памятью и malloc располагается один и более уровней, вполне возможна ситуация, что при наличии свободной памяти, выделить достаточно большой блок нельзя. Например, выделение памяти блоками по 2K обычно позволяет выделить больше, чем одним вызовом. И это при том, что на каждый блок тратится дополнительная память. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |