2017-01-18 15 views
0
unsigned char* createImageBuffer(unsigned int bytes) 
{ 
    unsigned char* ptr; 
    cudaSetDeviceFlags(cudaDeviceMapHost); 
    cudaHostAlloc(&ptr, bytes, cudaHostAllocMapped);  
    return ptr; 
} 


    cv::Mat sGray(frame.size(), CV_8U, createImageBuffer(frame.size().width * frame.size().height)); 

    cv::Mat dGray(frame.size(), CV_8U, createImageBuffer(frame.size().width * frame.size().height)); 

    cv::Mat eGray(frame.size(), CV_8U, createImageBuffer(frame.size().width * frame.size().height)); 

Проблема во время отладки связана с доступом к ограниченной памяти при 0x00000000. Функция должна возвращать указатель на место размещения байтов изображения, но это дает мне плохое значение ptr.Плохое значение ptr при попытке выделить память для буфера изображения

Выход:

первого шанса исключение в 0x0c10e473 в improc.exe: 0xC0000005: Access чтения нарушение расположения 0x00000000. Необработанное исключение в 0x0c10e473 в файле instc.exe: 0xC0000005: Чтение нарушения доступа местоположение 0x00000000.

видео к учебнику я последовал за: https://youtu.be/j9vb5UjQCQg

+3

Вы уверены, что 'frame' не пусто? – ilke444

+0

Точка доступа к нарушениям доступа 0x00000000 означает, что 'createImageBuffer' возвращает нулевой указатель. И самая возможная причина - то, что @ ilke444 указал - 'frame.size()' return 0. – pSoLT

ответ

1

АНИ, вероятно, не может выделить достаточно памяти. Проверьте возвращаемое значение cudaHostAlloc (см doku on cudaHostAlloc):

unsigned char* createImageBuffer(unsigned int bytes) 
{ 
    unsigned char* ptr; 
    cudaSetDeviceFlags(cudaDeviceMapHost); 
    cudaError_t allocResult = cudaHostAlloc(&ptr, bytes, cudaHostAllocMapped); 
    if (allocResult != cudaSuccess) { 
     // could be cudaErrorMemoryAllocation; The API call failed because 
     // it was unable to allocate enough memory to perform 
     // the requested operation. 
     return nullptr; 
    } 
    return ptr; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^