使用pin_ptr时访问冲突? [英] Access violation when using pin_ptr?

查看:151
本文介绍了使用pin_ptr时访问冲突?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我使用pin_ptr传递一个数组在本地c代码,我得到访问冲突。代码如下:

  array< float> ^ LogLikelihoodScore(array< array< unsigned char> ^& array< float> ^ featuresArray,int numberOfFrames)
{
int i,j,modelsNum = modelsBuffer-> Length,len;
float ** models =(float **)malloc(modelsNum * sizeof(void *));
for(i = 0; 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);
返回分数;
}

当我改变这个代码使得分配新的空间和复制原始数组到,我没有访问违规。
新代码:

  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]
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);
返回分数;问题:在使用pin_ptr时有什么问题吗?

问题:在使用pin_ptr时有什么问题吗?


解决方案


当锁定指针超出范围时,对象不再被认为是固定的,除非有其他锁定指向或到对象的指针。您不必显式取消固定指针。


文档说, pin_ptr 只定位目标 / em>。这意味着在以下循环的每次迭代之后,对象被取消固定,使得存储的指针无用。

  for i = 0; i  {
pin_ptr< unsigned char> ptr =& modelsBuffer [i] [0];
models [i] =(float *)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?

解决方案

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

这篇关于使用pin_ptr时访问冲突?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆