当使用pin_ptr时出现访问冲突?

3

当我在本地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有什么问题吗?


5
我猜你还没有确定那个问题,对吗? - Tony The Lion
你非常幸运能够早期发现这个问题。如果你在方法开始时分配了分数,那么你将面临一个非常偶尔的堆损坏问题。你仍然需要修复内存泄漏。 - Hans Passant
1个回答

3
当固定指针超出范围时,对象不再被视为固定,除非有其他固定指针指向或进入该对象。您不必显式取消固定指针。
文档所述,pin_ptr仅在其作用域内固定目标。这意味着在以下循环的每次迭代之后,对象都将被取消固定,使存储的指针无效。
for(i = 0; i < modelsNum; i++)
{
    pin_ptr<unsigned char> ptr = &modelsBuffer[i][0];
    models[i] = (float*) ptr;
}

4
恭喜我回答了1000个问题! - R. Martinho Fernandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接