Когда я использую 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?
Я думаю, вы не указали на эту проблему, а? –
Вам очень повезло, что поразить это рано. Если бы вы выделили * баллы * в начале метода, тогда у вас была бы очень неприятная проблема с очень случайным разрушением кучи. Вам еще нужно исправить утечку памяти. –