Проблема выделения памяти C / Cpp Windows критическая ошибка - PullRequest
0 голосов
/ 21 марта 2010

У меня есть код, который нужно «перевести» с C на Cpp, и я не могу понять, в чем проблема.Есть часть, где он аварийно завершает работу (критическая ошибка Windows send / dontSend):

 nDim = sizeMax*(sizeMax+1)/2;
 printf("nDim  = %d sizeMax = %d\n",nDim,sizeMax);
 hamilt = (double*)malloc(nDim*sizeof(double));
 printf("End hamilt alloc. %d allocated\n",(nDim*sizeof(double)));
 transProb = (double*)malloc(sizeMax*sizeMax*sizeof(double));
 printf("End transProb alloc. %d allocated\n",(sizeMax*sizeMax*sizeof(double)));
 eValues = (double*)malloc(sizeMax*sizeof(double));
 printf("eValues allocated. %d allocated\n",(sizeMax*sizeof(double)));
    eVectors  = (double**)malloc(sizeMax*sizeof(double*));
 printf("eVectors allocated. %d allocated\n",(sizeMax*sizeof(double*)));
 if(eVectors) for(i=0;i<sizeMax;i++) {
                 eVectors[i] = (double*)malloc(sizeMax*sizeof(double));
                 printf("eVectors %d-th element allocated. %d allocated\n",i,(sizeMax*sizeof(double)));
                 }
 eValuesPrev = (double*)malloc(sizeMax*sizeof(double));
 printf("eValuesPrev allocated. %d allocated\n",(sizeMax*sizeof(double)));
 eVectorsPrev  = (double**)malloc(sizeMax*sizeof(double*));
 printf("eVectorsPrev allocated. %d allocated\n",(sizeMax*sizeof(double*)));
 if(eVectorsPrev) for(i=0;i<sizeMax;i++) {
                     eVectorsPrev[i] = (double*)malloc(sizeMax*sizeof(double));
                     printf("eVectorsPrev %d-th element allocated. %d allocated\n",i,(sizeMax*sizeof(double)));
                     }

Log:

nDim  = 2485 sizeMax = 70
End hamilt alloc. 19880 allocated
End transProb alloc. 39200 allocated
eValues allocated. 560 allocated
eVectors allocated. 280 allocated 

Таким образом, происходит сбой в начале цикла распределения.Если я удаляю этот цикл, он падает на следующей строке выделения.Значит ли это, что с такими числами мне не хватает памяти ??

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 марта 2010

На моем компьютере эта программа компилируется, выполняется без ошибок и не сообщает о проблемах с памятью при запуске через valgrind.Если вы не работаете в небольшой встроенной системе, ваша проблема, вероятно, является чем-то внешним по отношению к этому коду, поскольку общий объем памяти, выделяемый этой программой, составляет менее 140 КБ.

Кроме того, когда malloc не удается,он не падает, он возвращает NULL.Этот код правильно проверяет, является ли eVectorsPrev NULL, поэтому здесь не должно быть проблем с разыменованием NULL.

1 голос
/ 21 марта 2010

Возможно, вы не пытаетесь выделить слишком много памяти. Какой-то другой код, вероятно, повредил кучу , и впоследствии он может кусаться практически в любой произвольной точке кода. Смотрите ссылку для отладки.

Если у вас недостаточно памяти в программе без дефектов, malloc выдаст сообщение об ошибке.

0 голосов
/ 21 марта 2010

Что такое sizeMax? Я не вижу декларации, пожалуйста, исправьте форматирование. Дополнительное замечание ... вы слепо звоните malloc, не проверяя, сработало ли это или нет ... это опасное предположение - никогда не думайте, что памяти достаточно, поскольку куча может стать очень фрагментированной и когда вызов malloc для очень маленького объекта в фрагментированной куче может произойти сбой, так как недостаточно памяти ...

...