2012-12-21 43 views
3

當我使用pin_ptr在本地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用我的任何問題嗎?

+4

我想你還沒有針對那個問題呃? –

+0

你很幸運能夠早早擊中它。如果您在方法開始時分配了*分數*,那麼您偶爾會遇到一個非常偶然的堆損壞問題。您仍然需要修復內存泄漏。 –

回答

3

當固定指針超出範圍時,該對象不再被視爲固定,除非有其他固定指針指向或進入對象。您不必顯式取消固定指針。

作爲the docs說,僅pin_ptr銷目標,而它在範圍。這意味着在下一個循環的每次迭代之後,該對象將被解除鎖定,從而使存儲的指針無用。

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

恭喜我的第1000個答案! –