我们知道程序的内存主要分两类,一类为栈内存,一类是堆内存。对应着进程地址空间的栈空间和堆空间,其中,栈内存指的是某个函数的临时变量存放的地方,一般是编译期间就能确定数据的大小;而堆内存一般是程序运行过程中,动态从进程的堆空间动态开辟的内存空间。我们这里说的内存管理,主要是指对堆内存的管理。
堆内存的管理方案,总体分为两类,一类为程序员手动管理方案,另一类为语言帮助程序员管理方案。
典型语言举例:
- 程序员手动管理方案:
- 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的方案提供给了自动内存管理方案。