Сейчас на форуме: rmn, ManHunter, _MBK_, tyns777, UniSoft (+10 невидимых)

 eXeL@B —› Программирование —› ошибка выделения памяти
Посл.ответ Сообщение

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 20 апреля 2012 21:05
· Личное сообщение · #1

Делаю вот такой код:
a_table = new unsigned int[modulus];
b_table = new unsigned int[modulus];

Далее идет заполнение таблиц a_table и b_table . Но в диспетчере задач видно, как зажирается по ходу исполнения программы память. Под конец программа падает.

Очевидно, что new[] не выделяет память, а резервирует (что объяснило бы постоянное увеличение памяти), существует ли разумный способ именно выделить память в куче? Стэк и глобальный массив не предлагать. И как такой механиз вообще мог вызвать падение?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 20 апреля 2012 21:08 · Поправил: VodoleY
· Личное сообщение · #2

int AllocMem(). я на тоже самое ток в делфе наступил, когда переменные начали наезжать на код,затирая его.. причем это были динамические массивы.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 20 апреля 2012 21:20 · Поправил: neomant
· Личное сообщение · #3

Такое возможео при стандартных утечках. Память периодически выделяем и не возвращаем. На каждый new должен быть свой delete, если я правильно понял суть проблемы. Причём на массив это должен быть delete [] var.

-----
Следуй за белым кроликом




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 20 апреля 2012 21:39
· Личное сообщение · #4

neomant
Ну допустим у меня есть такой delete[] на каждый из массивов. Программа падает ДО вызова delete. Основная операция в цикле заполнения - операция умножения, вынесенная в отдельную процедуру. Процедура вызываетя нерекурсивно, результат берется по модулю, соответствующему размера массива. Т.е. выход за диапазон массива исключается. Все индексы беззнаковые, т.е. пишется точно туда.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 20 апреля 2012 21:47 · Поправил: VodoleY
· Личное сообщение · #5

int проверь, не нализают ли данные на код!
ЗЫ во время падеша посмотри вверх модуля по коду, не затерт ли?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 20 апреля 2012 21:53 · Поправил: ARCHANGEL
· Личное сообщение · #6

int
Никогда не возникала у меня такая ситуация со встроенными new и delete. Возможно, если вы выделяете, скажем, так:

Code:
  1. a_table = new unsigned int[modulus];


И предположим, что modulus = 5. Так вот к такому динамическиому массиву нельзя обратиться так:

Code:
  1. a_table[5]


Т.е. обратиться-то можно, и, скорее всего, это не вызовет иксепшена, но вы затрёте участок служебной инфы, которая используется диспетчером куч, и delete[] не отработает. И да, будет утечка либо сбой, либо всё вместе.

Если, конечно, есть уверенность, что это имеено криворукая реализация компилятора, то перегружайте new, и юзайте API HeapCreate/HeapDestroy/HeapAlloc/HeapFree.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 20 апреля 2012 22:14
· Личное сообщение · #7

Давайте посмотрим код выделения, работы с массивом, освобождения. Ну чудес ведь не бывает. И в 99.9% это ошибки реализации, а не компиляторов.

-----
Следуй за белым кроликом





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 апреля 2012 23:02 · Поправил: reversecode
· Личное сообщение · #8

int пишет:
И как такой механиз вообще мог вызвать падение?

выход за границы массива
проверяется легко (кроме случая ручками правит <= на < в циклах)
взять какой нибудь std::array
ну или std::vector
или любой самописный с улучшеными оптимизациями,
и если есть выход за границы то ексепшен в лучшем случае поймаешь

---
ох что то я ступил, думал об одном посоветовал другое
банально умный указатель на массив(scoped_array/shared_array) и ненадо никаких array и vector
выход за границы по оператору operator[] там тоже ексепшен



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 20 апреля 2012 23:08
· Личное сообщение · #9

reversecode +1! я о чем говорю.. я убил както воскресенья в попытке понять где борланд накосячил с дниамическими массивами.. типа SetLenth +1 на 3ей итерации убивал всю прогу.. перерыл 2 модуля, оказалось компиллер гонит. в делфе об этом говорица как рекомендация.. не рекомендуеца часто изменять размеры выделенной памяти.. козлы. вобщем либо руками АЛОК либо статик массив с запасом

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 апреля 2012 00:31
· Личное сообщение · #10

Да не, все оказалось банально. Глаза замылились просто.

for (i = 0; i < modulus / 20; j++)

"Буковки похожие".

Но тем не менее, это не ответ на вопрос, почему размер памяти растет по мере ее использования, а не сразу после выделения.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 апреля 2012 00:41 · Поправил: reversecode
· Личное сообщение · #11

1) особенность работы malloc / можно проверить на разных студиях
2) особенности работы MMU разной версии винды/ тоже можно проверить

после чего легко можно вынести вердикт,
исходники malloc есть в студиях

свой вариант, переопределять new/delete под аллокатор который сразу будет резервировать всю память

----
сделай например memset после new
что бы зарезервировать в MMU место




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 21 апреля 2012 01:12
· Личное сообщение · #12

Может конечно "пальцем в небо", но мне этот прием когда-то помог разобраться с довольно загадочным memory leak.
Гляньте, если интересно:
http://www.abstraction.net/content/articles/analyzing%20the%20heaps%20of%20a%20win32%20process.htm

-----
Give me a HANDLE and I will move the Earth.





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 21 апреля 2012 03:07
· Личное сообщение · #13

int пишет:
Но тем не менее, это не ответ на вопрос, почему размер памяти растет по мере ее использования, а не сразу после выделения.

Если приложение GUI, то сама ОС что-то там выделяет/освобождает под свои нужны в куче приложения. Обычно это не растёт до бесконечности и лечится сворачиванием-разворачиванием окна.

-----
Следуй за белым кроликом




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 апреля 2012 05:06
· Личное сообщение · #14

Новая проблема. Не дают выделить память.
Code:
  1. mult_table = new unsigned int[100000000];
  2. mult_index_table = new unsigned int[100000000];
  3. rand_table = new unsigned int[100000000];
  4. rand_index_table = new unsigned int[100000000];

На 4-ой строке вылет по std::exception "bad allocation". Как обходить?

Добавлено:
Перекомпилил в 64 бита, все ОК!



Ранг: 23.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 09 мая 2012 00:37
· Личное сообщение · #15

"Никогда не возникала у меня такая ситуация со встроенными new и delete. Возможно, если вы выделяете, скажем, так:

Code:

a_table = new unsigned int[modulus];



И предположим, что modulus = 5. Так вот к такому динамическиому массиву нельзя обратиться так:

Code:

a_table[5]



Т.е. обратиться-то можно, и, скорее всего, это не вызовет иксепшена, но вы затрёте участок служебной инфы, которая используется диспетчером куч, и delete[] не отработает. И да, будет утечка либо сбой, либо всё вместе."

Зачем столько фольклора: есть термин -> Undefined behaviour, два слова и всё ясно.



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 09 мая 2012 01:30
· Личное сообщение · #16

TheNozza
Друг, шел бы ты на RSDN, Кодта плюсам учить. В большинстве RE кода такое месиво, что волосы дыбом встают. Здесь больше беспокоятся о результате, чем о красоте промышленного кода.
И таки да, школьники и студенты начальных курсов - часть типового портрета здешнего обитателя.

-----
старый пень



 eXeL@B —› Программирование —› ошибка выделения памяти
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати