C#和C/C++混合编程系列2-内存管理
2篇前置博文:
Http服务器-第十步加入基于Mono平台的C#脚本支持 http://dreamyouxi.com:7129/blog/1277
架构9-引入C#混合编程-服务端概述 http://dreamyouxi.com:7129/blog/1298
C#自带GC算法在独立使用时无需额外处理,cpp的话各种内存管理技术也很多如智能指针。
在这里混合编程下,c#层作为脚本使用时,很容易在cpp层书写核心代码,几乎2倍内存的消耗,但是这个不是本文的重点,本文阐述他们之间的内存关系和混合管理方式。这里的方案是cpp层通过handle来指向c#,c#端进行handle和实际的对象的引用。下面通过案例来阐述这种方式。
C#层
public class GameObject : object { private long _native_handle;//cpp ptr for }; //提供全局c# 对象 c++引用 static class CppReferenceInternal { public static Dictionary<int, object> global_cpp_ref = new Dictionary<int, object>(); public static void Retain(object obj) { int hash = obj.GetHashCode(); if (global_cpp_ref.ContainsKey(hash) == false) { global_cpp_ref.Add(hash, obj); } } public static void Release(object obj) { int hash = obj.GetHashCode(); if (global_cpp_ref.ContainsKey(hash)) { global_cpp_ref.Remove(hash); } } }
C++层
class GameObject { public: static GameObject*Create() { GameObject *ret = new GameObject(); return ret; }; GameObject() { AllocMonoObject(); } ~GameObject() { FreeMonoObject(); } private: bool FreeMonoObject() { MonoObjectRelease(mono_object_handle); mono_object_handle = nullptr; return true; } bool AllocMonoObject() { MonoClass *cls = mono_class_from_name(mono_assembly_get_image(mono_stick_engine_dll), "", "GameObject"); mono_object_handle = mono_object_new(vm, cls); //call default ctor mono_runtime_object_init(mono_object_handle); MonoObjectRetatin(mono_object_handle); return true; } private: MonoObject * mono_object_handle = nullptr; };
这里只是其中一种管理方式的基本示例。