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。