1. 内存分区

在C++中内存分为5个区,分别是栈区堆区全局/静态存储区代码|常量存储区共享内存区

  • 栈区:英文是 stack,在内存管理的语境下,指的是函数调用过程中产生的本地变量和调用数据的区域,存储非静态局部变量、临时对象、函数参数、 返回值等。满足“后进先出”(last-in-first-out 或 LIFO)。

  • 堆区:英文是 heap,在内存管理的语境下,程序运行时动态分配内存的区域。关键字 new 开辟的空间都在堆区

  • 静态区:存储全局数据和静态数据

  • 代码区:存储可执行的代码、只读常量

  • 共享内存区:用于进程之间进行间通讯

2. new 和 delete

在 c++ 中 , 如果要在堆内存中申请空间,那么需要借助 new 操作符,释放申请的空间,使用 delete操作 。而 c 语言使用的是mallocfree

C++ 中的自由存储区,英文是 free store,特指使用 new 和 delete 来分配和释放内存的区域。一般而言,这是堆的一个子集:

但 new 和 delete 通常底层使用 malloc 和 free 来实现,所以 free store 也是 heap。

2.1 new

代码展示:

#include <string>

using namespace std;

class A{
public:
    A(){
        puts("A 构造 ...");
    }
    ~A(){
        puts("A 析构 ~~~");
    }
};

int main() {

     A * a = new A;

    return 0;
}

运行结果:

A 构造 ...

2.2 delete

在c++中,deletenew 是成对出现的,所以就有了no new no delete的说法。delete用于释放new 申请的内存空间。 delete 的操作具备以下几个特征:

代码:

int main() {

    int * i = nullptr ;
    delete i;

     A * a = new A;
     delete a;
     delete a; //会报错

    return 0;
}

3. malloc 和 free

3.1 malloc

代码展示:

#include <iostream>
#include <string>

using namespace std;

class A{
public:
    A(){
        cout <<"A 构造 ..." <<endl;
    }
    ~A(){
        cout <<"A 析构 ~~~" <<endl;
    }
};

void  fo(A * aa ){
    A a;
    *aa = a;
}

int main() {

    int * a0 = new int(12);
    int * a1 = (int*)malloc(sizeof(int)); //函数原型: void *__cdecl malloc(size_t _Size);
    *a1 = 24;
    cout << "a0 : " << *a0 <<  " ;  a1 : " << *a1 << endl;

    A * aa = (A*)malloc(sizeof(A));
    cout <<"-------------------" <<endl;
    //再创建对象,然后再存到空间里面去。
    fo(aa);
	cout <<"-------------------" <<endl;

 return 0;
}

运行结果:

a0 : 12 ;  a1 : 24
-------------------
A 构造 ...
A 析构 ~~~
-------------------

3.2 free

int main() {

    int * a0 = new int(12);
    int * a1 = (int*)malloc(sizeof(int)); //函数原型: void *__cdecl malloc(size_t _Size);
    *a1 = 24;
    cout << "a0 : " << *a0 <<  " ;  a1 : " << *a1 << endl;

    A * aa = (A*)malloc(sizeof(A));
    cout <<"-------------------" <<endl;
    //再创建对象,然后再存到空间里面去。
    fo(aa);

    cout <<"-------------------" <<endl;

    //释放空间
    free(a1);
    free(aa);
    //free(aa);//重复释放,报错

    return 0;
}

运行结果:

a0 : 12 ;  a1 : 24
-------------------
A 构造 ...
A 析构 ~~~
-------------------
10-29 18:27