
垃圾回收器
C是贴近硬件的静态编译型语言,Python是面向开发者的动态解释型语言;前者需手动内存管理、语法严格、性能高,后者自动垃圾回收、语法简洁、开发快,二者定位不同、适用场景互补。
Go指针易引发内存泄漏、goroutine泄漏、datarace、逃逸分析失控及nil解引用panic,应优先使用值语义,仅在必要时用指针。
Go是垃圾回收语言,函数中创建并返回的map会由运行时自动跟踪和回收,无需手动释放或“free”,不存在传统意义上的内存泄漏风险。
闭包是函数与其定义时词法作用域中自由变量的组合;它使内部函数能持续访问外层函数变量,即使外层已执行完毕,常用于封装和工厂模式,但也可能导致内存泄漏。
Python内存管理依靠引用计数(即时释放)和垃圾回收(处理循环引用)协同工作;引用计数增减由赋值、作用域等操作触发,gc模块用标记-清除算法回收循环引用,分三代优化效率。
JavaScript垃圾回收通过标记-清除算法判断对象是否可回收:从全局对象等根出发,递归标记所有可达对象,未被标记的即不可达而被回收;循环引用问题使引用计数法被弃用。
C++标准不提供垃圾回收,引用计数(如std::shared_ptr)仅为RAII式确定性释放,并非真正GC;它无法解决循环引用、无堆扫描能力、有性能开销且不管理非new内存或非内存资源。
WeakMap的键必须是对象且弱引用,不阻止垃圾回收;仅支持set/get,不可遍历;适用于DOM私有数据和类私有字段,但不适用于缓存,且value强引用可能导致循环引用。
Python内存由解释器自动管理,核心机制包括引用计数(即时释放)、垃圾回收(处理循环引用)和对象池(缓存小整数-5~256及短字符串),不可变对象可复用,可变对象每次新建,应避免频繁创建大对象并优先...
栈用于存储值类型变量、方法参数等,由编译器自动管理;堆用于存储引用类型对象,由GC管理;refstruct禁止逃逸到堆;struct不一定在栈上,取决于声明位置;栈溢出不可捕获,堆内存不足会触发GC。