当我使用 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/