2010-08-19 24 views
4

好吧管理的陣列,我知道你通常會聲明指針:指針在C++/CLI

void SomeFunction(array<float> ^managedArray) 
{ 
    pin_ptr<float> managedArrayPtr = &managedArray[0]; 
} 

這個工程除了當managedArray不包含元素的罰款。在這種情況下,它會引發IndexOutOfRangeException。

在C#中,你可以這樣做:

void SomeFunction(float[] managedArray) 
{ 
    fixed (float* managedArrayPtr = managedArray) 
    { 
    } 
} 

這確實沒有內存訪問和工作,即使managedArray是空的。 我是否真的必須檢查我使用指向託管數組的指針的元素數量還是C++/CLI有辦法像C#那樣執行? 它應該使用ASM中的'lea'指令,它沒有內存訪問。

任何幫助,非常感謝!

回答

1

好問題。不幸的是,我不熟悉C++/CLI。我知道你可以使用GCHandle結構手動進行鎖定,並且可以在空數組上工作。儘管如此,它並不像使用pin_ptr那樣優雅。

void SomeFunction(array<float> ^managedArray) 
{ 
GCHandle handle = GCHandle::Alloc(managedArray, GCHandleType::Pinned); 
try 
{ 
    float* ptr = (float*)(void*)handle.AddrOfPinnedObject(); 
} 
finally 
{ 
    handle.Free(); 
} 
} 
+0

但是,那麼我不妨檢查一下長度。我希望有一個快捷方式,就像操作員或其他東西一樣。 – user425451 2010-08-19 17:50:40

+0

是的,檢查長度可能是要走的路。我GOOGLE了很多,我無法找到一個優雅的解決方案。 – 2010-08-19 18:07:31

3

從數組中讀取數據時,沒有太多意義。只是檢查:

void SomeFunction(array<float> ^managedArray) 
{ 
    if (managedArray->Length > 0) { 
     pin_ptr<float> managedArrayPtr = managedArray; 
     //etc... 
    } 
} 
+0

你是對的,但是到處檢查是很煩人的。我希望能夠簡寫,因爲像這樣的東西在指針語言中經常被使用。無論如何,我會用這個。 – user425451 2010-08-19 18:34:47

+0

*無處不在*?您需要謹慎使用這種代碼,對於垃圾收集器來說,釘住並不健康。 – 2010-08-19 18:38:18

+2

我正在包裝一個本地庫,我確實在任何地方都使用它。當然,它可能並不是真的「無處不在」,但是在包裝這個圖書館的時候,無處不在。 – user425451 2010-08-19 19:07:16