【问题标题】:Access violation when using pin_ptr?使用 pin_ptr 时访问冲突?
【发布时间】:2012-12-21 12:31:48
【问题描述】:

当我使用 pin_ptr 在本机 c 代码中传递一个数组时,我遇到了访问冲突。代码如下:

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

问题:我使用 from pin_ptr 有什么问题吗?

【问题讨论】:

  • 我猜你还没有指出这个问题吧?
  • 你很幸运能早点出手。如果您在方法开始时分配了 scores,那么您将遇到一个非常严重的问题,即偶尔会出现堆损坏。您仍然需要修复内存泄漏。

标签: c++-cli access-violation pin-ptr


【解决方案1】:

当固定指针超出范围时,对象不再被视为固定,除非有其他固定指针指向或进入该对象。您不必显式取消固定指针。

正如the docs 所说,pin_ptr 仅在目标处于作用域时锁定目标。这意味着在以下循环的每次迭代之后,对象都会被取消固定,从而使存储的指针变得无用。

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

【讨论】:

  • 恭喜我的第 1000 个回答!
猜你喜欢
  • 2010-11-19
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多