2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3  След.
 
 ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:28 
Добрый день!
решил протестировать свою программу на нормальных данных, но в некоторых случаях она стала зависать,
разбирался долго, проблема как понял в обращении по недопустимому адресу, нашел даже строчку где это обращение происходит,
но вот беда - память то выделена как положено, malloc() возвращает нормальный указатель, а не "0". На малых данных такой проблемы вообще нет, всё начинается с нескольких Гб, иногда он выдаёт «0», хотя память еще доступная имеется в большом избытке, а иногда и нормальный указатель (что мне нравится ещё меньше), но по факту выделяется меньше памяти, чем запрошено. Это подтверждается тем, что ошибка возникает при попытке записи в конец массива, при записи в начало массива всё работает нормально.
В чём тут может быть дело?

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:36 
Andrey_Kireew в сообщении #1331578 писал(а):
В чём тут может быть дело?
В фрагментации памяти. Формально в наличии ее достаточно, но непрерывного куска нужного размера (а malloc() запрашивает именно непрерывный) нет.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:43 
Pphantom а почему же тогда malloc() не возвращает "0" как это положено, тогда хоть можно было бы повторный вызов сделать, или ещё как то решить, а так то что он выдаёт указатель которым и пользоваться нельзя ...

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:51 
Если и ОС и программа x64, то может быть ошибка приведения типа указателя где-то, он приводится (в том числе неявно) к 32-м битам и перестаёт адресовать хвост массива, если ОС выделила память выше 4Г. В принципе это возможно и при физической памяти (даже вместе с pagefile.sys) менее 4Г, выделение памяти не привязано адресами к первым гигабайтам.
Распечатайте выданный malloc() указатель на массив и вычислите адрес конца, не выше ли он 4Г. И если да - проверяйте все операции со всеми указателями в этот массив.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 13:06 
Вывел через printf() получилось отрицательное значение -2144075712, в общем это 0xFFFFFFFF80340040,
подозрительно как то. А Вы что думаете Dmitriy40?

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 13:12 
Andrey_Kireew в сообщении #1331587 писал(а):
а почему же тогда malloc() не возвращает "0" как это положено, тогда хоть можно было бы повторный вызов сделать, или ещё как то решить, а так то что он выдаёт указатель которым и пользоваться нельзя ...
А вот тут нужны параметры ОС, которую Вы используете.
Andrey_Kireew в сообщении #1331596 писал(а):
Вывел через printf() получилось отрицательное значение -2144075712, в общем это 0xFFFFFFFF80340040,
подозрительно как то.
Это не "подозрительно", это очевидная чушь. По-видимому, Dmitriy40 прав, у Вас там еще где-то проблемы с типами.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 13:58 
Тут у меня размер массива был типа int - видимо по этому, поменял все int на _int64, стало работать. Но вот беда, доходить до 38 Гб примерно - и опять та же "петрушка". Вообще у меня Win7 стоит, не должно быть с этим проблем.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:04 
Andrey_Kireew в сообщении #1331604 писал(а):
Но вот беда, доходить до 38 Гб примерно - и опять та же "петрушка".
А у Вас реально есть машина с таким объемом памяти под Windows 7 (и необходимость загнать все это в один массив)?

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:22 
а на чём Вы думаете я это запускаю?

-- 10.08.2018, 15:26 --

... другими словами все int поменял на _int64, перепроверил 10 раз. Всё равно 38 Гб где то, я по монитору ресурсов смотрю, как до этого доходит - всё виснет и замирает.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:32 
Andrey_Kireew в сообщении #1331611 писал(а):
а на чём Вы думаете я это запускаю?
Ну, возможно, я несколько предвзят, но по прошлому опыту я бы скорее удивился, что до 38Гб все прошло нормально.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:40 
Исправил ошибку в одном месте и пошло, но я почему то не удивился, а расстроился. Хотелось, что бы всё наконец то заработало. А то уже второй день не сплю ...

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:48 
Аватара пользователя
Andrey_Kireew в сообщении #1331611 писал(а):
а на чём Вы думаете я это запускаю?
Всё, что мы знаем, это то, что вы запускаете это на машине под управлением Win7. Объём доступной оперативной памяти вы не упоминали.

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 16:03 
Поменял даже все счётчики в циклах на _int64, теперь заработало по полной, жаль, что так и не определил, в каком месте была проблема. Кстати, вопреки моим представлениям, смена int на _int64 только ускорила работу алгоритма, примерно на 10%

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 16:58 
Andrey_Kireew в сообщении #1331578 писал(а):
но в некоторых случаях она стала зависать,
разбирался долго, проблема как понял в обращении по недопустимому адресу, нашел даже строчку где это обращение происходит,
Скорее всего, у вас случилась т. н. "порча памяти". Если оборудование исправно (компьютер не подвисает сам собой с другими программами), то в этом всегда виноват программист. Вы или где-то освободили этот блок ранее, а потом продолжили им пользоваться, либо записали что-то куда-то туда, куда вам писать было нельзя (за границы ваших массивов).

 
 
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 17:06 
 i  GAA:
Обсуждение альтернативы C|C++ выделено в самостоятельную ветку. Заголовок может быть изменён по предложению Aritaborian. Для этого ЛС мне или модераторам раздела.

(Aritaborian)

Да тут надо сначала перестать хранить инты и даблы в одном массиве (см. предыдущую тему), потому что так «нравится». Ой, молчу-молчу.

 
 
 [ Сообщений: 32 ]  На страницу 1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group