dlang语言最新dmd2103版本关于内存管理的介绍文章链接为httpsdlangorgphoboscore_memoryhtml文字描述我提取了下如下:corememorystableJump to __delete · GC · moveToGC · pageSize · pureCalloc · pureFree · pureMalloc · pureReallocThis module
关键知识点:
- core.memory模块提供内存管理接口,允许在不影响二进制兼容性的情况下切换垃圾回收器。
- 垃圾回收器采用保守标记-清除算法,只有在分配内存时才运行回收,不会影响程序的性能,但可能会导致线程阻塞。
- 在多线程环境下,需要注意不要在GC不知道的线程中持有GC分配的内存引用,可以使用addRoot/removeRoot和addRange/removeRange注册或解注册这些数据,或者在线程活动时禁用GC回收。
- 实现垃圾回收器时需要注意:必须支持内部指针、执行析构函数时不能访问对象内部的引用、可以进行堆内存压缩和复制但不能移动GC.BlkAttr.NO_MOVE标记的内存块,等等。
示例代码:
- 使用pureMalloc分配内存并初始化为0:
import core.memory;
void main()
{
int* p = cast(int*)pureMalloc(sizeof(int));
*p = 0;
writeln(*p);
pureFree(p);
}
- 使用GC分配内存并设置为NULL:
import std.stdio;
import core.memory;
void main()
{
int* p = cast(int*)GC.malloc(sizeof(int));
*p = 1;
writeln(*p);
GC.free(p);
p = null;
writeln(p is null);
}
- 使用addRange注册内存块,防止在GC回收时被误删:
import std.stdio;
import core.memory;
void main()
{
int[] arr = [1, 2, 3];
GC.addRange(arr.ptr, arr.length * arr[0].sizeof);
arr.length = 0;
writeln(arr); // 输出[]
GC.collect(); // 手动触发GC回收
writeln(arr); // 输出[1, 2, 3]
GC.removeRange(arr.ptr);
}
``
原文地址: http://www.cveoy.top/t/topic/fj60 著作权归作者所有。请勿转载和采集!