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

被折叠的 条评论
为什么被折叠?



