c++-cli - 使用 pin_ptr 时出现访问冲突?

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

当我使用 pin_ptr 在 native 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 有什么问题吗?

最佳答案

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.

作为the docs例如,pin_ptr 仅在目标在范围内时固定目标。这意味着在以下循环的每次迭代之后,对象将被取消固定,从而使存储的指针变得无用。

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

关于c++-cli - 使用 pin_ptr 时出现访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990264/

相关文章:

c++ - IShellDisptach:为什么 FolderItemVerbs::Release() + CoUninitialize() 会崩溃?

c++ - 为什么我会遇到这种访问冲突?

c++-cli - C++/CLI 方法调用 native 方法来修改 int - 需要 pin_ptr?

c++-cli - C++/CLI 中属性 getter/setter 的不同访问修饰符

namespaces - 如何在 C++/CLI 应用程序中正确设置根命名空间属性?

c# - 将 C++/CLI 桥接到 C# 时防止垃圾回收

c++ - C++/CLI 中的十进制到十六进制函数

c++ - 为什么 IsValid(Object) 返回 true 后 Object 不能安全使用?