[C++应用程序性能优化]内存分配失败处理

本文探讨了C++中通过自定义new_handler()函数实现内存管理与异常处理的方法,包括增加内存容量、抛出bad_alloc异常、调用abort()或exit()退出程序。通过实例展示了如何在程序中灵活控制内存分配与释放过程。

c++中new_handler()函数,通过set_new_handler()安装到系统上,new_handler()要执行下述操作一种:
(1)使new有更多的内存可用,然后返回
(2)抛出一个bad_alloc()或其派生的异常
(3)调用abort()或exit()退出

#include <stdio.h>
#include <new>

using namespace std;

char *gPool;
void my_new_handler();

int main()
{
 set_new_handler(my_new_handler);
 gPool = new char[100*1024*1024];
 if (gPool != NULL)
 {
  printf("preserve 101MB memory at %x.\n", gPool);
 }
 char *p = NULL;
 for (int i = 0; i < 20; i++)
 {
  p = new char[100*1024*1024];
  printf("%d*100M, p = %x\n", i+1, p);
 }
 printf("Done.\n");
 return 0;
}

void my_new_handler()
{
 if (gPool != NULL)
 {
  printf("try to get more memry...\n");
  delete []gPool;
  gPool = NULL;
  return;
 }
 else
 {
  printf("I can not help...\n");
  throw bad_alloc();
 }
 return;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <new>

using namespace std;

int main()
{
 char buffer[100];
 char *p = new(buffer) char[20];
 printf("buffer:\t%x\np:\t%x\n", buffer, p);
 system("pause");
 return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <new>

using namespace std;

void* operator new(size_t n, char *file, int line)
{
 printf("size: %d\n new at %s, %d\n", n, file, line);
 return ::operator new(n);
}

void operator delete(void *p, char *file, int line)
{
 printf("delete at %s, %d\n", file, line);
 ::operator delete(p);
 return;
}

#define new new(__FILE__, __LINE__)

int main()
{
 char *p = new char[10];
 operator delete(p, __FILE__, __LINE__);
 system("pause");
 return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值