Postupy: Zařazení vložených ukazatelů pomocí C++ Interop
Následující příklady kódu používají managed, unmanaged direktivy # pragma k implementaci spravované a nespravované funkce ve stejném souboru, ale tyto funkce spolupracují stejným způsobem, pokud jsou definovány v samostatných souborech. Soubory obsahující pouze nespravované funkce nemusí být kompilovány s /clr (Common Language Runtime Compilation).
Příklad
Následující příklad ukazuje, jak může být nespravovaná funkce, která přebírá strukturu obsahující ukazatele, volána ze spravované funkce. Spravovaná funkce vytvoří instanci struktury a inicializuje vložený ukazatel s novým klíčovým slovem (namísto klíčového slova gcnew). Protože to přidělí paměť na nativní haldě, není nutné připnout pole, aby potlačilo uvolňování paměti. Paměť však musí být explicitně odstraněna, abychom se vyhnuli úniku paměti.
// marshal_embedded_pointer.cpp
// compile with: /clr
#include <iostream>
using namespace System;
using namespace System::Runtime::InteropServices;
// unmanaged struct
struct ListStruct {
int count;
double* item;
};
#pragma unmanaged
void UnmanagedTakesListStruct(ListStruct list) {
printf_s("[unmanaged] count = %d\n", list.count);
for (int i=0; i<list.count; i++)
printf_s("array[%d] = %f\n", i, list.item[i]);
}
#pragma managed
int main() {
ListStruct list;
list.count = 10;
list.item = new double[list.count];
Console::WriteLine("[managed] count = {0}", list.count);
Random^ r = gcnew Random(0);
for (int i=0; i<list.count; i++) {
list.item[i] = r->NextDouble() * 100.0;
Console::WriteLine("array[{0}] = {1}", i, list.item[i]);
}
UnmanagedTakesListStruct( list );
delete list.item;
}