不停的new和delete,有可能会导致分配一个较大的内存块时失败,主要是因为内存碎片。
  如果new出稍大块的内存,失败一定会发生,原因在于内存碎片太多后,当在申请一块大内存时,系统无法分配一块连续的没有使用过的内存给你,解决方法 是申请一大块内存,在这一大块内存中再进行自己的分配,而不用系统的new,可以参考内存池的思想,其实nginx的内存分配思想更好,直接分配一大块内 存,进程所需内存在上面再划分,进程结束时再释放内存,对于长期运行的服务很有意义。
  换用自己写的内存管理器能一定程度避免这种情况.
  现代OS,new理论上不会失败,因为还可以把你的硬盘空间作为虚拟内存来分配.所以没必要检测new失败的情况,一旦真的分配失败,你接下来任何操作都可能失败,即使只显示个对话框或者写个log记录什么的都不一定能成功.直接让程序崩溃是好的办法.
  你一次申请的内存太大了,所以失败。 在WINDOW系统中,现在不会出现内存不足的情况,因为有硬盘可以当内存分页使用,所以不会出现内存不足的情况,只有当你申请很大的一块内存,而系统还没有整理内存,查找不到这么大的连续内存块,所以失败。
  boost::shared_array<uint8> data_ (new uint8[size]);   内存分配用boost的shared_array,利用boost栈对象保存分配的内存,在分配失败时  data_.get()为空,运行时可以很方便的找到错误点。
  常规的char * tmp = new char[1024]若分配失败,但又没进行异常捕捉时,很难进行纠错。