主流语言的内存管理探究

我们知道程序的内存主要分两类,一类为栈内存,一类是堆内存。对应着进程地址空间的栈空间和堆空间,其中,栈内存指的是某个函数的临时变量存放的地方,一般是编译期间就能确定数据的大小;而堆内存一般是程序运行过程中,动态从进程的堆空间动态开辟的内存空间。我们这里说的内存管理,主要是指对堆内存的管理。

堆内存的管理方案,总体分为两类,一类为程序员手动管理方案,另一类为语言帮助程序员管理方案。
典型语言举例:

  • 程序员手动管理方案:
    • C语言
  • 语言帮助程序员管理方案:
    • C++语言
    • Java语言
    • Go语言
    • Python语言
    • Rust语言

C语言

C语言是通过libc库提供的malloc和free函数,来分配和释放堆内存。

    int *get_memory_from_heap(int size) 
    {
        int *ptr = NULL;
        ptr = (int *)malloc(size * sizeof(int));
        return ptr;
    }

    int main(int argc, char *argv[])
    {
        int size = 4;
        int *ptr = get_memory_from_heap(4);
        assert(ptr != NULL);
        int i;
        // use it
        for (i = 0; i < size; i++) {
            ptr[i] = i;
        }
        //free it after used.
        free(ptr);
        ptr = NULL;
    }

C++语言

C++语言提供了基于RAII智能指针的自动内存管理方案。

#include <iostream>
#include <memory>
#include <string>
using namespace std;


class student {
    public:
    student() {
        this->age = 10;
	this->name = "denghui";
	cout<<"default constructor"<<endl;
    }
    
    student(int age, string name):age(age),name(name) {
	cout<<"parameter constructor"<<endl;
    }

    ~student() {
        cout<<"student descontructor"<<endl;
    }

    int get_age() {
        return this->age;
    }

    string get_name() {
        return this->name;
    }

    void set_age(int age) {
         this->age = age;
    }
    
    void get_name(string name) {
         this->name = name;
    }
    private:
         int age;
         string name;
};

int main(int argc, char *argv[])
{
    {
        unique_ptr<student> ptr_stu1 = make_unique<student>();
        ptr_stu1->set_age(10);
        cout<<"age is "<<ptr_stu1->get_age()<<endl;
    }

     return 0;
}

Java语言

Java语言提供了基于GC的自动化内存管理方案。

public class Playground {
    public static void main(String[ ] args) {
        {
            MemoryTest t = new MemoryTest();
            System.out.println(t.get_count());
	    t = null;
            System.out.println(t1.get_count());
	    System.gc();
        }
    }
}

class MemoryTest 
{
      //Static counter variable
      private static int count = 0;
      //The object's id
      private int myId;
      //Constructor
      public MemoryTest() 
      {
        myId = count;
        count++;
        System.out.println("Object created" + myId);
      }
      public int get_count()
      {
          return this.count;
      }
      //Finalize method implementation
      protected void finalize() throws Throwable 
      {
        try
        {
            System.out.println("Object destroyed " + myId);
        }
        finally
        {
            super.finalize();
        }
     }
}

Go语言

Go语言也提供了基于GC的自动化内存管理方案。

Python语言

Python也提供了基于GC的自动化内存管理方案。

Rust语言

Rust语言也提供了基于RAII的智能指针的自动化内存管理方案。
Rust是一门新的语言,继承了很多其他语言的优势,在内存管理方面继承了C++语言的优点,基于RAII的方案提供给了自动内存管理方案。

posted @ 2022-03-20 12:21  东东安安  阅读(66)  评论(0编辑  收藏  举报