Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access violation when using pin_ptr?

When I use pin_ptr to pass an array in native c code, I get access violation. The code is as bellow:

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;
}

When I changed this code such that allocate new spaces and copy original array to that, I didn't get access violation. New code:

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;
}

Question: Are there any problem in my using from pin_ptr?

like image 878
Hossein Zeinali Avatar asked Apr 30 '26 22:04

Hossein Zeinali


1 Answers

When a pinning pointer goes out of scope, the object is no longer considered pinned, unless there are other pinning pointers pointing to or into the object. You do not have to explicitly unpin a pointer.

As the docs say, pin_ptr only pins the target while it is in scope. This means that after each iteration of the following loop, the object is unpinned, rendering the pointers that were stored useless.

for(i = 0; i < modelsNum; i++)
{
    pin_ptr<unsigned char> ptr = &modelsBuffer[i][0];
    models[i] = (float*) ptr;
}
like image 181
R. Martinho Fernandes Avatar answered May 04 '26 13:05

R. Martinho Fernandes



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!