• 主流语言的内存管理探究


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

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

    • 程序员手动管理方案:
      • 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的方案提供给了自动内存管理方案。

  • 相关阅读:
    mac下用xattr命令来删除文件的扩展属性
    使用vue.js实现checkbox的全选和多个的删除功能
    正则表达式匹配任意字符(包括换行符)的写法
    jQuery Mobile动态刷新页面样式
    jquery mobile各类标签的refresh
    jQuery .attr()和.removeAttr()方法操作元素属性示例
    jquery mobile各类组件刷新方法
    Apache PDFbox开发指南之PDF文档读取
    日期字符串解析--SimpleDateFormat严格限制日期转换setLenient(false)
    hdu5032 Always Cook Mushroom
  • 原文地址:https://www.cnblogs.com/freedh/p/16029557.html
Copyright © 2020-2023  润新知