私は相互運用のために設計されているC++コードに次の関数との構造を有する:呼び出し後にInterop構造メモリを解放する必要がありますか?
extern "C" __declspec(dllexport) typedef struct
{
int num_vertices;
int *vertices;
} Vertex_List;
extern "C" __declspec(dllexport) typedef struct
{
int num_cycles;
Vertex_List *cycles;
} Cycle_List;
extern "C" __declspec(dllexport) typedef struct
{
int v1;
int v2;
} Edge;
extern "C" __declspec(dllexport) typedef struct
{
int num_edges;
Edge *edgeList;
} Edge_List;
extern "C" __declspec(dllexport) Cycle_List Traversal(Edge_List edgeList);
をそして、これは私の対応の.NET構造のコードです:
[StructLayout(LayoutKind.Sequential)]
internal struct EdgeSpecial
{
public int v1;
public int v2;
}
[StructLayout(LayoutKind.Sequential)]
internal struct Edge_List
{
public int num_edges;
public IntPtr edgeList;
}
[StructLayout(LayoutKind.Sequential)]
internal struct Vertex_List
{
public int num_vertices;
public IntPtr vertices;
}
[StructLayout(LayoutKind.Sequential)]
internal struct Cycle_List
{
public int num_cycles;
public IntPtr cycles;
}
[DllImport("BoostAPI.dll")]
public static extern Cycle_List Traversal([In] Edge_List edgeList);
これは私がで私の呼び出しを行う方法です純関数:
//converts from my edge structure to the interop structure
Edge_List edgeList = EdgeConvertor(edges);
//interop call
Cycle_List cycleInterop = GraphBoostInterop.Traversal(edgeList);
// converts from interop cycle structure to my .NET structure
var cycleList = CycleListConvertor(cycleInterop);
問題であり、cycleInterop
は私のデータ構造cycleList
に変換された後、I edgeList
とcycleInterop
を解放する必要がありますよ?私はC++の内側FreeCycle
またはそのようなコードを作成し、メモリの目的を解放するためにそれに構造体を渡すべきか?はいの場合、どうですか?
編集:これはCycle_ListはC++に移入された方法です。基本的には、同様のデータ構造(std::vector
を使用)から情報をコピーするだけです。
i=0;
Cycle_List cList;
cList.num_cycles=cycleList.CycleList.size();
cList.cycles=(Vertex_List*)malloc(cList.num_cycles*sizeof(Vertex_List));
for(std::vector<Cycle>::const_iterator it = cycleList.CycleList.begin(); it != cycleList.CycleList.end(); ++it)
{
Cycle cycle = *it;
Vertex_List vList;
vList.num_vertices = cycle.VertexList.size();
vList.vertices= (int*) malloc (vList.num_vertices*sizeof(int));
j=0;
for(std::vector<int>::const_iterator intList=cycle.VertexList.begin(); intList!=cycle.VertexList.end(); ++intList)
{
vList.vertices[j++] = *intList;
}
cList.cycles[i++]=vList;
}
[QuickGraph(http://quickgraph.codeplex.com/)C#で書かれた優れたグラフライブラリです。そのAPIはBoostによく一致するように設計されています。 –
@Tim、そのままでは、アルゴリズムの中にはQuickGraphでは利用できないものもあります。 – Graviton
十分です。あなたの質問に答えて: 'Cycle_List'は' IntPtr'を含んでいますので、あなたは何かを解放する必要があります。しかし、適切な機能はBoostのどこかにあります。 Boostのドキュメントを読むべきです。 –