malloc和free是C语言用来分配和回收堆内存的函数,而new和delete是C++语言的引进的关键字。
-- malloc函数
void *malloc( size_t size );
该函数需要传入一个参数,该参数指明要分配多少个字节的内存;返回一个void类型的指针。
示例用法:int* a = (int*)malloc(4*sizeof(int));
-- free函数
void free( void *memblock );
该函数需要传入待回收堆内存的首地址。
关于C语言的内存分配和释放,比较简单,没什么需要特别注意的地方。
----------------------------------------------------------------------------
以下重点讨论new/delete的一些要注意的细节,new [] / delete[]类似。
+++ 3种类型的new/delete +++
(1)new operator/delete operator
为语言内建的操作符,不能被程序员改变其行为。
对于基本类型而言,new只会为其分配相应的内存;delete只会将分配的内存进行回收。
但对于复合类型,new除了分配内存之外,还会调用该对象的构造函数来对对象进行初始化;delete除了回收内存,还会在此之前,调用该对象的析构函数来对对象执行清理工作。
(2)operator new/operator delete
通过编写operator new/operator delete函数,程序员可以自定义分配和释放内存时所执行的操作。
尽量不用这种类型的new和delete,对于复合类型往往会带来一些问题。
注意:这种自定义的new和delete是不会调用构造函数和析构函数的,这点与malloc和free比较相像。
opeartor new的函数通常声明如下:
void* operator new(size_t size);
调用方式为:
std::string* pStr = ::operator new(sizeof(std::string));
------
opeartor delete的函数通常声明如下:
void operator delete(void* pMem);
调用方式为:
::operator delete(pStr);
new [] / delete []
void * operator new[] (size_t size);
void operator delete[] (void* pMem);
(3)placement new
有时可能会有一些分配好的原始内存,我们需要在上面构建对象。placement new可以用来达到此目的。placement new是c++标准程序库的一部分,要使用placement new,必须#include <new>。placement new在已有的内存地址上构建对象,并会调用构造函数。
具体用法:
class widget
{
public:
widget(int n);
};
widget* constructWidgetInBuf(void* buf, int n)
{
return new (buf) widget(n);
}
*** new的异常处理 ***
如果new了很大的一块空间,最好是进行异常判断。
try{
int* pMem = new int[100000];
}
catch(std::bad_alloc& e)
{
std::cout << e.what() << std::endl;
}
以上需要#include <new>。