【C++】动态内存管理

【C++】

动态内存管理:

C语言中:标准库的函数 malloc/free

void Test1()
{
    int* p1 = (int*)malloc(sizeof(int) * 4);
    free(p1);
    p1 = NULL;
    int* p2 = (int*)calloc(4, sizeof(int));
    int* p3 = (int*)realloc(p2, sizeof(int) * 6);
    //p2开辟的内存空间被修改为p3/p2已被释放
    free(p3);
    p3 = NULL;
}

C++中:c++操作符 new/delete

void Test2()
{
    int* p1 = new int;//p1指向一个int型的空间/动态分配4个字节
    int* p2 = new int(3);//初始化为3
    int* p3 = new int[3];//开辟了3个int型空间/动态分配12个字节
    delete p1;
    delete p2;
    delete[] p3;//匹配使用 防止内存泄漏
}

区别与联系:

  • 都是动态内存管理的入口
  • malloc/free 是C/C++标准库的函数,new/delete 是C++操作符
  • malloc/free只是动态分配内存和释放空间,new/delete 还会调用构造/析构函数
  • malloc/free使用时要自己计算空间大小,返回void*指针,使用指针时需自己强转;new会自己计算空间大小,返回相应的类型的指针

内存管理

这里写图片描述

深入了解new/delete & new[]/delete[]

  • new 会调用operator new函数,还会调用构造函数进行初始化
  • delete 会调用operator delete函数,调用析构函数进行释放
  • new[]会调用operator new[]函数,会调用N次构造函数初始化
  • delete[]调用operator delete[]函数,会调用N次析构函数
class Array
{
public:
    Array(size_t size = 1)
        :_a(0)
        , _size(size)
    {
        cout << "Array" << endl;
        if (_size > 0)
        {
            _a = new int[_size];
        }
    }
    ~Array()
    {
        cout << "~Array" << endl;
        if (_a)
        {
            delete[] _a;
            _a = 0;
            _size = 0;
        }
    }
private:
    int* _a;
    size_t _size;
};
int main()
{
    Array* p1 = new Array;
    delete p1;
    Array* p2 = new Array[2];
    delete[] p2;
    return 0;
}

void* operator new(size_t size) 这些函数并没有重载new和delete,我们不能对new/delete进行表达式重定义
- 这些函数也是通过使用molloc来开辟空间,通过free来释放空间

深度剖析

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_32672481/article/details/70666542