内存释放方法、装置、客户端、服务端及存储介质制造方法及图纸

技术编号:37985513 阅读:8 留言:0更新日期:2023-06-30 10:00
本公开涉及计算机技术领域,涉及一种内存释放方法、装置、客户端、服务端及存储介质,该方法包括:响应于第一对象对第二对象的调用,确定第二对象的虚表指针;其中,第一对象为第一进程创建的,第二对象为第二进程创建的,第一进程由客户端以及服务端中的一者运行,第二进程由客户端以及服务端中的另一者运行,虚表指针所指向的虚表中包括指向第二对象的析构函数的析构指针;将析构指针修改为指向自定义析构函数的自定义指针;其中自定义析构函数用于在第二进程释放第二对象的内存时,发送析构指令至第一进程,析构指令用于指示第一进程释放第一对象的内存。由此确保跨进程调用中对象生命周期的可控,避免内存泄漏。避免内存泄漏。避免内存泄漏。

【技术实现步骤摘要】
内存释放方法、装置、客户端、服务端及存储介质


[0001]本公开涉及计算机
,具体地,涉及一种内存释放方法、装置、客户端、服务端及存储介质。

技术介绍

[0002]在Linux 系统中,虚拟内存机制为每个进程分配了线性连续的内存空间,并由操作系统将这种虚拟内存空间映射到物理内存空间。其中,每个进程有自己的虚拟内存空间,而不能操作其他进程的内存空间,也即进程与进程间的内存和数据是不共享的。在实际应用场景中,一个进程的功能往往是有限的,需要与其他进程交互,即跨进程调用。
[0003]在计算机程序跨进程的对象调用中,对象的创建和销毁逻辑在本地或者远端的其它进程空间。其中,创建逻辑通常由应用层代码主动发起,而销毁逻辑则随着进程间某个功能函数或者其它函数的调用而触发,本进程空间无法主动发起和感知其他进程空间对象的销毁,这导致对象的生命周期不可控。

技术实现思路

[0004]本公开的目的是提供一种内存释放方法、装置、客户端、服务端及存储介质,以解决相关技术中的问题。
[0005]为了实现上述目的,本公开实施例的第一方面提供一种内存释放方法,所述方法包括:响应于第一对象对第二对象的调用,确定所述第二对象的虚表指针;其中,所述第一对象为第一进程创建的,所述第二对象为第二进程创建的,所述第一进程由客户端以及服务端中的一者运行,所述第二进程由所述客户端以及所述服务端中的另一者运行,所述虚表指针所指向的虚表中包括指向所述第二对象的析构函数的析构指针;将所述析构指针修改为指向自定义析构函数的自定义指针;其中,所述自定义析构函数用于在所述第二进程释放所述第二对象的内存时,发送析构指令至所述第一进程,所述析构指令用于指示所述第一进程释放所述第一对象的内存。
[0006]可选地,所述方法还包括:在所述第二进程对所述虚表的操作权限为只读的情况下,新建用于复现所述虚表的结构的自定义虚表;复制所述虚表的内容到所述自定义虚表中;将所述虚表指针修改为指向所述自定义虚表;其中,所述自定义虚表包括指向所述第二对象的析构函数的析构指针。
[0007]可选地,所述方法还包括:获取所述第二进程的目标头文件,所述目标头文件中包括所述第二对象所在目标类的代码部分;通过预设编译命令对所述目标头文件进行编译,得到所述第二对象的虚表结构;
其中,所述虚表结构包括指向析构函数的析构指针以及所述析构指针在所述虚表中的偏移量。
[0008]可选地,所述方法还包括:根据所述虚表指针以及所述析构指针的偏移量,在所述虚表中确定所述析构指针。
[0009]可选地,所述第一进程以及所述第二进程之间基于RPC协议或者gRPC协议进行通信。
[0010]可选地,所述第一对象通过接口回调的方式调用所述第二对象。
[0011]本公开实施例的第二方面提供一种内存释放装置,所述装置包括:响应模块,用于响应于第一对象对第二对象的调用,确定所述第二对象的虚表指针;其中,所述第一对象为第一进程创建的,所述第二对象为第二进程创建的,所述第一进程由客户端以及服务端中的一者运行,所述第二进程由所述客户端以及所述服务端中的另一者运行,所述虚表指针所指向的虚表中包括指向所述第二对象的析构函数的析构指针;修改模块,用于将所述析构指针修改为指向自定义析构函数的自定义指针;其中,所述自定义析构函数用于在所述第二进程释放所述第二对象的内存时,发送析构指令至所述第一进程,所述析构指令用于指示所述第一进程释放所述第一对象的内存。
[0012]本公开实施例的第三方面提供一种客户端,所述客户端用于运行第一进程以创建第一对象,实现上述第一方面中任一项所述的内存释放方法。
[0013]本公开实施例的第四方面提供一种服务端,所述服务端用于运行第一进程以创建第一对象,实现上述第一方面中任一项所述的内存释放方法。
[0014]本公开实施例的第五方面提供一种计算机可读存储介质,其上存储有计算机程序指令,该程序指令被处理器执行时实现本公开第一方面中任一项所提供的内存释放方法的步骤。
[0015]通过上述技术方案,在第一对象对第二对象的调用中,可以确定第二对象的虚表指针,其中,该虚表指针所指向的虚表中包括指向第二对象的析构函数的析构指针。在此基础上,可以在调用过程中,将第二对象的析构指针修改为指向自定义析构函数的自定义指针,由此在第二进程释放第二对象的内存时,可以通过自定义析构函数发送析构指令至第一进程,从而使得第一进程得知第二对象的销毁时机,并相应释放第一对象的内存。在这个过程中,可以通过自定义析构函数截获第二进程中第二对象的销毁时机,从而使得对象的生命周期可控,由此避免内存泄漏。
[0016]本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
[0017]附图是用来提供对本公开的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本公开,但并不构成对本公开的限制。在附图中:图1是根据一示例性实施例示出的一种内存释放方法的流程图。
[0018]图2是根据另一示例性实施例示出的一种内存释放方法的流程图。
[0019]图3是根据一示例性实施例示出的一种编译得到虚表结构的示意图。
[0020]图4是根据一示例性实施例示出的一种修改析构指针的示意图。
[0021]图5是根据另一示例性实施例示出的一种修改析构指针的示意图。
[0022]图6是根据一示例性实施例示出的一种内存释放装置的框图。
[0023]图7是根据一示例性实施例示出的一种客户端的框图。
[0024]图8是根据一示例性实施例示出的一种服务端的框图。
具体实施方式
[0025]以下结合附图对本公开的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本公开,并不用于限制本公开。
[0026]相关技术针对例如Java以及C++等面向对象的编程语言,定义了虚函数表(Virtual Function Table,简称虚表,V

table)。虚表本质上是指针数组,其数组元素为指向虚函数的函数指针。虚表的构造通常发生在编译阶段,编译器可以为每个包括虚函数的类创建对应的虚函数表。在虚表构造完成后,对象内存空间可以包括指向虚表的虚表指针。由此,在计算机程序通过对象进行函数调用时,可以根据对象的虚表指针获取虚表的入口,并基于此从虚表中查找所调用函数对应的函数指针。
[0027]在虚表中,通常还包括一种特殊的成员函数:析构函数。析构函数可以在对象被销毁时自动被调用,由此可以根据析构函数有效管理对象的生命周期。例如,在基于C++语言编写的程序中,对象被销毁时该对象的析构函数自动被调用,从而触发对象内部的释放逻辑。
[0028]然而,在计算机程序跨进程的对象调用中,本进程空间的对象所调用的其它进程空间的对象随着其析构函数的调用而释放内存。在这个过程中,本进程无法感知其他进程空间的对象对析构函数的调用,也即无法感知其他进程空间本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种内存释放方法,其特征在于,所述方法包括:响应于第一对象对第二对象的调用,确定所述第二对象的虚表指针;其中,所述第一对象为第一进程创建的,所述第二对象为第二进程创建的,所述第一进程由客户端以及服务端中的一者运行,所述第二进程由所述客户端以及所述服务端中的另一者运行,所述虚表指针所指向的虚表中包括指向所述第二对象的析构函数的析构指针;将所述析构指针修改为指向自定义析构函数的自定义指针;其中,所述自定义析构函数用于在所述第二进程释放所述第二对象的内存时,发送析构指令至所述第一进程,所述析构指令用于指示所述第一进程释放所述第一对象的内存。2.根据权利要求1所述的内存释放方法,其特征在于,所述方法还包括:在所述第二进程对所述虚表的操作权限为只读的情况下,新建用于复现所述虚表的结构的自定义虚表;复制所述虚表的内容到所述自定义虚表中;将所述虚表指针修改为指向所述自定义虚表;其中,所述自定义虚表包括指向所述第二对象的析构函数的析构指针。3.根据权利要求1所述的内存释放方法,其特征在于,所述方法还包括:获取所述第二进程的目标头文件,所述目标头文件中包括所述第二对象所在目标类的代码部分;通过预设编译命令对所述目标头文件进行编译,得到所述第二对象的虚表结构;其中,所述虚表结构包括指向析构函数的析构指针以及所述析构指针在所述虚表中的偏移量。4.根据权利要求3所述的内存释放方法,其特征在于,所述方法还包括:根据所述虚表指针以及所述析构指针的偏移量,在所述虚表中确定所述析构指针。5...

【专利技术属性】
技术研发人员:陈露王鲲陈飞邹懋
申请(专利权)人:北京趋动智能科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1