问题描述
我有以下问题:
int get_struct_from_dll (some_struct** return_struct);
int get_struct_form_dll (some_struct** return_struct) {
some_struct st;
st.some_void_pointer = nullptr;
st.some_string = "some_string";
some_struct* st_ptr = &st;
*return_stuct = return_struct;
return 1;
}
return_struct
是双指针,因为get_struct_from_dll
必须自己分配存储空间。
在不需要尺寸信息之前,它也只包含一个元素。
some_struct
看起来像这样:
typedef struct {
void *some_void_pointer;
const char *some_string;
} some_struct;
现在在c#端:
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)]
public struct some_struct
{
public IntPtr instance;
[MarshalAs(UnmanagedType.LPStr)]
public string host;
}
[DllImport(_dllPath)]
public static extern ReturnTypes get_struct_form_dll (IntPtr server);
IntPr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
get_struct_form_dll(ptr);
IntPtr ptrptr = Marshal.ReadintPtr(ptr);
some_struct st= (some_struct) Marshal.PtrToStructure(ptrptr,typeof(some_struct));
现在的问题是,当我打印st
时,它只会返回垃圾,但是不会抛出任何错误。
请帮助!
[DllImport(_dllPath)]
public static extern ReturnTypes get_struct_form_dll (out IntPtr server);
IntPr ptr;
get_struct_form_dll(out ptr);
some_struct st = (some_struct) Marshal.PtrToStructure(ptr,typeof(some_struct));
结果与以前完全相同。
解决方法
我终于找到了解决问题的方法。
解决方案是,在c ++端,返回后会自动释放内存。 这导致c#读取未分配的内存,这显然是行不通的。
因此解决方案是将c ++方面更改为以下内容:
int get_struct_form_dll (some_struct** return_struct) {
some_struct* st = (some_struct*) malloc(sizeof(some_struct));
*return_struct = st;
return 1;
}
这可以防止在调用后删除数据。
请小心,因为目前从未释放过malloc调用。 这会导致内存泄漏。