1.引子
在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单。然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次。这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要的,是否能写一个自定义的分配器,某种高级内存管理表或一个特定的垃圾回收机制。这篇文章并不是一个综合的手册,而是一个C++中各种内存分配方法的概述。它面向已经很熟悉C++语言的读者。
2.原生operator new
我们先从原生operator new开始。考虑如下代码,它用来分配5个int型的空间并返回指向他们的指针:
int* v = static_cast<int*>(::operator new(5 * sizeof(*v)));
当像如上的调用,operator new扮演原生的内存分配角色,类似malloc,上面等价于:
int* v = static_cast<int*>(malloc(5 * sizeof(*v)));
释放用operator new分配的内存用operator delete:
::operator delete(v);
你愿意永远用原生new和delete函数吗?是,只在极少数不用,我在下面的文章中会论证的。为什么用它们而不用原来的可信的malloc和free呢?一个很充分的原因就是你想保持代码在C++领域的完整性。混合使用new和free(或malloc和delete)是很不可取的(big NO NO)。用new和delete的另一个原因是你可以重载(overload)或重写(override)这些函数,只要你需要。下面是个例子:
void* operator new(size_t sz) throw (std::bad_alloc)
{
cerr << "allocating " << sz << " bytesn";
void* mem = malloc(sz);
if (mem)
return mem;
else
throw std::bad_alloc();
}
void operator delete(void* ptr) throw()
{
cerr << "deallocating at " << ptr << endl;
free(ptr);
}
通常,注意到new被用来给内置类型,不包含用户自定义new函数的类的对象,和任意类型的数组分配空间,使用的都是全局的运算符new。当new被用来为已经被重定义new的类实例化时,用的就是那个类的new函数。
下面来看下自带new函数的类。
3.特定类的operator new
大家有时很好奇"operator new"和"new operator"的区别。前者可以是一个重载的operator new,全局的或者特定类或者原生的operator new。后者是你经常用来分配内存的C++内置的