您的位置:首页 > 编程语言 > C语言/C++

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

2012-12-30 13:57 627 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: