什么是语义内存泄漏?

What is Semantical Memory Leak?

我理解内存泄漏的定义,但找不到任何与语义语义内存相关的内容Leakmemory leak.

的区别

内存泄漏示例

#include <stdlib.h>

void function_which_allocates(void) {
    /* allocate an array of 45 floats */
    float *a = malloc(sizeof(float) * 45);

    /* additional code making use of 'a' */

    /* return to main, having forgotten to free the memory we malloc'd */
}
int main(void) {
    function_which_allocates();

    /* the pointer 'a' no longer exists, and therefore cannot be freed,
     but the memory is still allocated. a leak has occurred. */
}

定义(语义垃圾) 程序永远不会再使用的变量,但是 仍然保留对它的引用,称为语义垃圾。

换句话说,想象一下在您的主程序中分配一个数组并仅在前几行中使用它,并且在您完成后不释放它。基本上语义内存泄漏和内存泄漏之间的主要区别在于,在内存泄漏中你没有引用未释放的数组,但是在语义泄漏中你实际上有一个引用它虽然你不再使用它。

定义(语义垃圾)

程序永远不会再使用的变量,但是 仍然保留对它的引用,称为语义垃圾。

class Huge {
    Huge() { // Constructor:
             // Allocates lots of data and stores
             // it in the newly created object
    }
}

void f() {
    Huge semanticGarbage = new Huge();
    heavy.computation(new Indeed(100));
    System.exit(1);
}

所有复杂的 GC 算法都无法对抗语义垃圾。

Reference: Technion CS 234319: Programming Languages Course

(Lecture) Chapter 5 Storage 5.5 Automatic memory management - Semantical memory leak