java和c#混合语言编程,C#和C++混合编程系列1-内存管理

本文探讨了在C#与C++混合编程时如何处理内存管理问题。通过C#的句柄引用cpp对象,利用C++的智能指针技术,实现跨语言的内存控制。具体实现中,C#对象持有cpp对象的handle,cpp层通过这个handle操作对应的C#对象。案例展示了C# GameObject类与C++ GameObject类如何交互,包括对象创建、引用计数的增减以及释放资源的方法。
摘要由CSDN通过智能技术生成

2篇前置博文:

C#自带GC算法在独立使用时无需额外处理,cpp的话各种内存管理技术也很多如智能指针。

在这里混合编程下,c#层作为脚本使用时,很容易在cpp层书写核心代码,几乎2倍内存的消耗,但是这个不是本文的重点,本文阐述他们之间的内存关系和混合管理方式。这里的方案是cpp层通过handle来指向c#,c#端进行handle和实际的对象的引用。下面通过案例来阐述这种方式。

C#层

10c58740002fba6f0401549c3bcf359e.png

public class GameObject : object

{

private long _native_handle;//cpp ptr for

};

//提供全局c# 对象 c++引用

static class CppReferenceInternal

{

public static Dictionary global_cpp_ref = new Dictionary();

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);

}

global_cpp_ref = new Dictionary();

}

}

C++层

457b95b8624217281544884e0bd514ae.png

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;

};

这里只是其中一种管理方式的基本示例。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值