欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++内存管理

程序员文章站 2022-05-12 08:45:06
...

一、malloc/free和new/delete之间关系和差异
(1)操作对象有所不同:
malloc和free是C++/C语言的标准库函数,new/delete是C++运算符。 malloc/free无法满足动态开辟对象的空间的要求,因为对象在创建的同时要执行构造函数,对象消亡的时候会自动调用析构函数。
(2) 用法上也有所不同
malloc原型:void*malloc(size_t size)
用malloc申请一块长度为length的整数类型的内存:
int*p=(int*)malloc(sizeof(int)* length);

函数free的原型如下:
void free( void* memblock)
由于指针p的类型以及它所指的内存的容量都是知道的,所以free(p)能正确的释放内存,如果p是NULL指针,那么free多少次都不会出问题,如果不是NULL,free两次就会出导致程序运行错误。

new/delete的使用特点:

int*p1 = (int* )malloc(sizeof(int)* length);
int*p2 = new int[length];

new内置了sizeof、类型转换、类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态队形的同事也完成了初始化工作。

区别与联系总结:
1.都是动态管理内存的入口;
2.malloc/fre是C/C++标准库函数,new/delete是C++操作符;
3.malloc/free只是动态分配/释放内存空间,而new/delete除了分配空间还会调用构造函数和析构函数初始化和清理;
4.malloc/free需要手动计算类型大小且返回值为void*,new/delete可计算类的大小并返回对应类型的指针。

二、剖析new/delete、new[]/delete[]到底做了些什么事情
标准库函数operator new和operator delete的命名容易让人误解,这些函数并没有重载new或delete表达式,我们不能定义new或delete的行为。

void*operator new(size_tsize);
void operator delete(size_tsize);
void*operator new[](size_tsize);
voidoperator delete[](size_tsize);

总结:
1.operator new/operator delete operator new[]/operator delete[]和malloc/free用法一样。
2.他们只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象。
3.实际operatornew和operatordelete只是malloc和free的一层封装。

new做了两件事
1.调用operator new分配空间。
2.调用构造函数初始化对象。

delete也做了两件事
1.调用析构函数清理对象
2.调用operator delete释放空间

new[N]
1.调用operator new分配空间。
2.调用N次构造函数分别初始化每个对象。

delete[]
1.调用N次析构函数清理对象。(思考这里怎么N是怎么来的?)
2.调用operator delete释放空间。

C++内存管理

三、实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。

“`

define NEW_ARRAY(PTR,TYPE,N)\

do{         \
  PTR = (TYPE*)operator new(sizeof(TYPE)*N+4);/*开辟空间*/ \
  (*(int*)TYPE) = N;                                      \
  PTR = (TYPE*)((char*)PTR+4);                            \
  for(size_t i = 0; i < N; i++)                           \
      new(PTR+i)TYPE;            /*进行初始化*/             \

}while(false);

define DELETE_ARRARY(PTR,TYPE) \

do{ \
size_t N = ((int)PTR) - 1 \
for (size_t i = 0; i < N; ++i) \
PTR[i].~TYPE() \
PTR = (TYPE*)((char*)PTR - 4) \
operator delete(PTR) \
} while (false)

相关标签: malloc