2012-12-21 2 views
3

Когда я использую pin_ptr для передачи массива в собственном c-коде, я получаю нарушение прав доступа. Код, как показано ниже:Нарушение прав доступа при использовании pin_ptr?

array<float>^ LogLikelihoodScore(array<array<unsigned char>^>^ modelsBuffer , array<float>^ featuresArray, int numberOfFrames) 
{ 
    int i, j, modelsNum = modelsBuffer->Length, len; 
    float **models = (float**) malloc(modelsNum * sizeof(void*)); 
    for(i = 0; i < modelsNum; i++) 
    { 
     pin_ptr<unsigned char> ptr = &modelsBuffer[i][0]; 
     models[i] = (float*) ptr; 
    } 
    array<float>^ scores = gcnew array<float>(modelsNum); 
    pin_ptr<float> scoresPtr = &scores[0]; 
    pin_ptr<float> featuresPtr = &featuresArray[0]; 
    char* message = CalculateLikelihoodUsingBufferedModels(models, modelsNum, featuresPtr, numberOfFrames, scoresPtr); 
    return scores; 
} 

Когда я изменил этот код таким образом, чтобы выделить новые пространства и скопировать исходный массив в том, что я не получил нарушение прав доступа. Новый код:

array<float>^ LogLikelihoodScore(array<array<unsigned char>^>^ modelsBuffer , array<float>^ featuresArray, int numberOfFrames) 
{ 
    int i, j, modelsNum = modelsBuffer->Length, len; 
    float **models = (float**) malloc(modelsNum * sizeof(void*)); 
    for(i = 0; i < modelsNum; i++) 
    { 
     len = modelsBuffer[i]->Length; 
     char* ptr = (char*) malloc(len); 
     pin_ptr<unsigned char> ptr2 = &modelsBuffer[i][0]; 
     memcpy(ptr, ptr2, len); 
     models[i] = (float*) ptr; 
    } 
    array<float>^ scores = gcnew array<float>(modelsNum); 
    pin_ptr<float> scoresPtr = &scores[0]; 
    pin_ptr<float> featuresPtr = &featuresArray[0]; 
    char* message = CalculateLikelihoodUsingBufferedModels(models, modelsNum, featuresPtr, numberOfFrames, scoresPtr); 
    return scores; 
} 

Вопрос: Есть ли какие-либо проблемы в моем использовании из pin_ptr?

+4

Я думаю, вы не указали на эту проблему, а? –

+0

Вам очень повезло, что поразить это рано. Если бы вы выделили * баллы * в начале метода, тогда у вас была бы очень неприятная проблема с очень случайным разрушением кучи. Вам еще нужно исправить утечку памяти. –

ответ

3

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

the docs Как говорят, pin_ptr только прикрепляет цель , пока он находится в области видимости. Это означает, что после каждой итерации следующего цикла объект остается незакрепленным, делая указатели, которые были сохранены бесполезно.

for(i = 0; i < modelsNum; i++) 
{ 
    pin_ptr<unsigned char> ptr = &modelsBuffer[i][0]; 
    models[i] = (float*) ptr; 
} 
+4

Поздравляем с моим 1000-м ответом! –