new/delete

new和delete是C++中的运算符,不是库函数,不需要库的支持。

new的工作机理

string *sp=new string("a value");//一个new表达式

new表达式调用一个operator new(或者operator new[])的标准库函数,该函数分配一个原始的,足够大小的,未命名的内存空间

编译器运行相应的构造函数以构造这些对象,并进行初始化

返回一个指向该对象的指针(当然指向该对象的指针必须和该对象的类型相同)

delete的工作机理

delete sp;

将sp所指的对象执行对应的析构函数

然后调用标准库函数operator delete(或者operator delete[])释放掉内存空间

malloc/free

malloc/free是库函数

malloc返回一个void*指针,需要进行强制类型转换

free接受一个void*指针,它是malloc返回的指针的副本,free将相关内存返回给系统,但是被free收回的内存不会立刻返回给操作系统,而是被ptmalloc使用双链表记录下来,当下次申请内存时,系统会从双链表中找到合适的内存空间,这样避免了系统的频繁调用,节约资源。同时,ptmalloc会尝试将小块内存进行合并,避免了过多的内存碎片。

malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free。

posted on 2023-07-21 09:59  小凉拖  阅读(6)  评论(0编辑  收藏  举报