eXeL@B —› Программирование —› ошибка выделения памяти |
Посл.ответ | Сообщение |
|
Создано: 20 апреля 2012 21:05 · Личное сообщение · #1 Делаю вот такой код: a_table = new unsigned int[modulus]; b_table = new unsigned int[modulus]; Далее идет заполнение таблиц a_table и b_table . Но в диспетчере задач видно, как зажирается по ходу исполнения программы память. Под конец программа падает. Очевидно, что new[] не выделяет память, а резервирует (что объяснило бы постоянное увеличение памяти), существует ли разумный способ именно выделить память в куче? Стэк и глобальный массив не предлагать. И как такой механиз вообще мог вызвать падение? |
|
Создано: 20 апреля 2012 21:08 · Поправил: VodoleY · Личное сообщение · #2 |
|
Создано: 20 апреля 2012 21:20 · Поправил: neomant · Личное сообщение · #3 |
|
Создано: 20 апреля 2012 21:39 · Личное сообщение · #4 neomant Ну допустим у меня есть такой delete[] на каждый из массивов. Программа падает ДО вызова delete. Основная операция в цикле заполнения - операция умножения, вынесенная в отдельную процедуру. Процедура вызываетя нерекурсивно, результат берется по модулю, соответствующему размера массива. Т.е. выход за диапазон массива исключается. Все индексы беззнаковые, т.е. пишется точно туда. |
|
Создано: 20 апреля 2012 21:47 · Поправил: VodoleY · Личное сообщение · #5 |
|
Создано: 20 апреля 2012 21:53 · Поправил: ARCHANGEL · Личное сообщение · #6 int Никогда не возникала у меня такая ситуация со встроенными new и delete. Возможно, если вы выделяете, скажем, так: Code:
И предположим, что modulus = 5. Так вот к такому динамическиому массиву нельзя обратиться так: Code:
Т.е. обратиться-то можно, и, скорее всего, это не вызовет иксепшена, но вы затрёте участок служебной инфы, которая используется диспетчером куч, и delete[] не отработает. И да, будет утечка либо сбой, либо всё вместе. Если, конечно, есть уверенность, что это имеено криворукая реализация компилятора, то перегружайте new, и юзайте API HeapCreate/HeapDestroy/HeapAlloc/HeapFree. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 20 апреля 2012 22:14 · Личное сообщение · #7 |
|
Создано: 20 апреля 2012 23:02 · Поправил: reversecode · Личное сообщение · #8 int пишет: И как такой механиз вообще мог вызвать падение? выход за границы массива проверяется легко (кроме случая ручками правит <= на < в циклах) взять какой нибудь std::array ну или std::vector или любой самописный с улучшеными оптимизациями, и если есть выход за границы то ексепшен в лучшем случае поймаешь --- ох что то я ступил, думал об одном посоветовал другое банально умный указатель на массив(scoped_array/shared_array) и ненадо никаких array и vector выход за границы по оператору operator[] там тоже ексепшен |
|
Создано: 20 апреля 2012 23:08 · Личное сообщение · #9 reversecode +1! я о чем говорю.. я убил както воскресенья в попытке понять где борланд накосячил с дниамическими массивами.. типа SetLenth +1 на 3ей итерации убивал всю прогу.. перерыл 2 модуля, оказалось компиллер гонит. в делфе об этом говорица как рекомендация.. не рекомендуеца часто изменять размеры выделенной памяти.. козлы. вобщем либо руками АЛОК либо статик массив с запасом ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 21 апреля 2012 00:31 · Личное сообщение · #10 |
|
Создано: 21 апреля 2012 00:41 · Поправил: reversecode · Личное сообщение · #11 1) особенность работы malloc / можно проверить на разных студиях 2) особенности работы MMU разной версии винды/ тоже можно проверить после чего легко можно вынести вердикт, исходники malloc есть в студиях свой вариант, переопределять new/delete под аллокатор который сразу будет резервировать всю память ---- сделай например memset после new что бы зарезервировать в MMU место |
|
Создано: 21 апреля 2012 01:12 · Личное сообщение · #12 |
|
Создано: 21 апреля 2012 03:07 · Личное сообщение · #13 int пишет: Но тем не менее, это не ответ на вопрос, почему размер памяти растет по мере ее использования, а не сразу после выделения. Если приложение GUI, то сама ОС что-то там выделяет/освобождает под свои нужны в куче приложения. Обычно это не растёт до бесконечности и лечится сворачиванием-разворачиванием окна. ----- Следуй за белым кроликом |
|
Создано: 21 апреля 2012 05:06 · Личное сообщение · #14 Новая проблема. Не дают выделить память. Code:
На 4-ой строке вылет по std::exception "bad allocation". Как обходить? Добавлено: Перекомпилил в 64 бита, все ОК! |
|
Создано: 09 мая 2012 00:37 · Личное сообщение · #15 "Никогда не возникала у меня такая ситуация со встроенными new и delete. Возможно, если вы выделяете, скажем, так: Code: a_table = new unsigned int[modulus]; И предположим, что modulus = 5. Так вот к такому динамическиому массиву нельзя обратиться так: Code: a_table[5] Т.е. обратиться-то можно, и, скорее всего, это не вызовет иксепшена, но вы затрёте участок служебной инфы, которая используется диспетчером куч, и delete[] не отработает. И да, будет утечка либо сбой, либо всё вместе." Зачем столько фольклора: есть термин -> Undefined behaviour, два слова и всё ясно. |
|
Создано: 09 мая 2012 01:30 · Личное сообщение · #16 TheNozza Друг, шел бы ты на И таки да, школьники и студенты начальных курсов - часть типового портрета здешнего обитателя. ----- старый пень |
eXeL@B —› Программирование —› ошибка выделения памяти |
Эта тема закрыта. Ответы больше не принимаются. |