2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:28 


07/10/15

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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:36 
Заслуженный участник


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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:43 


07/10/15

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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 12:51 
Заслуженный участник


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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 13:06 


07/10/15

2400
Вывел через printf() получилось отрицательное значение -2144075712, в общем это 0xFFFFFFFF80340040,
подозрительно как то. А Вы что думаете Dmitriy40?

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 13:12 
Заслуженный участник


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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 13:58 


07/10/15

2400
Тут у меня размер массива был типа int - видимо по этому, поменял все int на _int64, стало работать. Но вот беда, доходить до 38 Гб примерно - и опять та же "петрушка". Вообще у меня Win7 стоит, не должно быть с этим проблем.

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:04 
Заслуженный участник


09/05/12
25179
Andrey_Kireew в сообщении #1331604 писал(а):
Но вот беда, доходить до 38 Гб примерно - и опять та же "петрушка".
А у Вас реально есть машина с таким объемом памяти под Windows 7 (и необходимость загнать все это в один массив)?

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:22 


07/10/15

2400
а на чём Вы думаете я это запускаю?

-- 10.08.2018, 15:26 --

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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:32 
Заслуженный участник


09/05/12
25179
Andrey_Kireew в сообщении #1331611 писал(а):
а на чём Вы думаете я это запускаю?
Ну, возможно, я несколько предвзят, но по прошлому опыту я бы скорее удивился, что до 38Гб все прошло нормально.

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:40 


07/10/15

2400
Исправил ошибку в одном месте и пошло, но я почему то не удивился, а расстроился. Хотелось, что бы всё наконец то заработало. А то уже второй день не сплю ...

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 14:48 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Andrey_Kireew в сообщении #1331611 писал(а):
а на чём Вы думаете я это запускаю?
Всё, что мы знаем, это то, что вы запускаете это на машине под управлением Win7. Объём доступной оперативной памяти вы не упоминали.

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 16:03 


07/10/15

2400
Поменял даже все счётчики в циклах на _int64, теперь заработало по полной, жаль, что так и не определил, в каком месте была проблема. Кстати, вопреки моим представлениям, смена int на _int64 только ускорила работу алгоритма, примерно на 10%

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 16:58 


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

 Профиль  
                  
 
 Re: ограничения на выделение памяти malloc()
Сообщение10.08.2018, 17:06 
Заслуженный участник


27/04/09
28128
 i  GAA:
Обсуждение альтернативы C|C++ выделено в самостоятельную ветку. Заголовок может быть изменён по предложению Aritaborian. Для этого ЛС мне или модераторам раздела.

(Aritaborian)

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group