C语言与C++内存管理

    xiaoxiao2021-03-25  72

    malloc、realloc、calloc和free几个函数的申明分别为:

    void* malloc(unsigned size);

    void* calloc(size_t numElements,size_t sizeof(Element));

    void* realloc(void* ptr,unsigned newsize);

    他们的返回值都是请求系统分配的地址,如果请求失败就返回NULL;

    其中malloc用于申请一段新的地址,参数size为需要内存空间的大小;

    calloc第一个参数为申请地址的单位元素长度,第二个为元素个数;

    realloc是给一个已经分配了地址的指针重新分配空间,第一个参数为原有空间的地址,第二个为重新申请后的地址长度;

    free调用形式为:free(void* ptr);  释放ptr所指向的一块内存空间。

    C++通过new和delete动态管理内存:

    其中:new、delete动态管理对象;new[]、delete[]动态管理对象数组。

    malloc、free和new、delete的区别与联系:

    1.他们都是动态管理内存的入口;

    2.malloc、free是C/C++标准库函数,new、delete是C++操作符;

    3. .malloc、free只是动态分配内存空间/释放空间。而new、delete除了分配空间还调用构造函数和析构函数进行初始化与清理(清理成员);

    4..malloc、free需要手动计算类型大小且返回值为void*,new、delete可自己计算类型大小,返回值对应类型的指针。

    C++其他内存管理接口:

    void* operator new(size_t size);

    void  operator delete(void* ptr);

    void* operator new[](size_t size);

    void  operator delete[](void* ptr);

    这几个均为函数,并非重载;

    他们只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象;

    实际上operator new和operator delete只是malloc、free的一层封装。

    其中new干两件事:

    1.调用operator new分配空间。

    2.调用构造函数初始化对象。

    delete也干两件事:

    1.调用析构函数清理对象。

    2.调用operator delete释放空间。

    定位new表达式

    定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

    两种方式:new (place_address) type;

                       new (place_address) type(initializer-list);

    place_address必须是一个指针,initializer-list是类型的初始化列表。

    转载请注明原文地址: https://ju.6miu.com/read-37360.html

    最新回复(0)