SGI STL:空间配置器——第一级配置器:__malloc_alloc_template
配置 空间 __ STL Template malloc alloc
2023-09-27 14:29:24 时间
第一级配置器介绍
首先需要定义一个开关宏用来抛出异常,输出一个oom信息。
namespace Srh
{
#if 0
#include<new>
#define __THROW_BAD_ALLOC throw std::bad_alloc;
#elif !defined(__THROW_BAD_ALLOC)
#define __THROW_BAD_ALLOC std::cerr << "out of memory" << std::endl; exit(1);
#endif
}
类模板为:
// 第一级配置器
template<int inst>
class __malloc_alloc_template {};
方法
第一级配置器的方法,直接调用malloc,free,realloc,如果出现内存不足的情况,就交给私有方法(oom__)处理。
public:
using PFUN = void (*)();
public:
static void* allocate(size_t n) // malloc
static void deallocate(void* p, size_t n); //free
// realloc
static void* reallocate(void* p, size_t old_sz, size_t new_sz);
//static void (*set_malloc_handler(void (*f))();
static PFUN set_malloc_handler(PFUN p)
private:
static void* omm_malloc(size_t n);
static void* oom_realloc(void* p, size_t new_sz);
//static void(*__malloc_alloc_oom_handler)();
static PFUN __malloc_alloc_oom_handler;
源码
#ifndef MY_ALLOC_H
#define MY_ALLOC_H
#include<iostream>
namespace Srh
{
#if 0
#include<new>
#define __THROW_BAD_ALLOC throw std::bad_alloc;
#elif !defined(__THROW_BAD_ALLOC)
#define __THROW_BAD_ALLOC std::cerr << "out of memory" << std::endl; exit(1);
#endif
// 第一级配置器
template<int inst>
class __malloc_alloc_template
{
public:
using PFUN = void (*)();
private:
// 处理内存不足问题
static void* oom_malloc(size_t n)
{
void* result = nullptr;
void (*my_malloc_handler) () = nullptr;
// 要么得到空间,要么终止程序
for (; ;) // 不断尝试 释放、配置、再释放、再配置...
{
my_malloc_handler = __malloc_alloc_oom_handler;
if (nullptr == my_malloc_handler)
{
__THROW_BAD_ALLOC;
}
my_malloc_handler(); //调用处理例程,企图释放内存
result = malloc(n); // 再次尝试配置内存
if (nullptr != result)
{
return result;
}
}
}
static void* oom_realloc(void* p, size_t new_sz)
{
void* result = nullptr;
void (*my_malloc_handler) () = nullptr;
// 要么得到空间,要么终止程序
for (; ;) // 不断尝试 释放、配置、再释放、再配置...
{
my_malloc_handler = __malloc_alloc_oom_handler;
if (nullptr == my_malloc_handler)
{
__THROW_BAD_ALLOC;
}
my_malloc_handler(); //调用处理例程,企图释放内存
result = realloc(p, new_sz); // 再次尝试配置内存
if (nullptr != result)
{
return result;
}
}
}
//static void(*__malloc_alloc_oom_handler)();
static PFUN __malloc_alloc_oom_handler;
public:
static void* allocate(size_t n)
{
void* result = malloc(n); // malloc
if (nullptr == result)
{
// 无法满足需求,采用oom_malloc
result = oom_malloc(n);
}
return result;
}
static void deallocate(void* p, size_t n)
{
free(p); // free
}
static void* reallocate(void* p, size_t old_sz, size_t new_sz)
{
void* result = realloc(p, new_sz); // realloc
if (nullptr == result)
{
// 无法满足需求,采用oom_realloc
result = oom_realloc(p, new_sz);
}
return result;
}
//static void (*set_malloc_handler(void (*f))();
static PFUN set_malloc_handler(PFUN p)
{
PFUN old = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = p;
return old;
}
};
/*
template<int inst>
void(*__malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = nullptr;
*/
template<int inst>
typename __malloc_alloc_template<inst>::PFUN
__malloc_alloc_template<inst>::__malloc_alloc_oom_handler = nullptr;
// 将参数inst置为0
using malloc_alloc = __malloc_alloc_template<0>;
}
#endif
相关文章
- 用usb线配置直流电机驱动器不能配置成功
- 模型接口元素的 C 代码生成配置
- 第六章 配置命名空间(一)
- k8s【资源管理(resources)】4--LimitRange为配置命名空间内存最小和最大约束
- SpringBoot配置图片访问404SpringBoot配置图片访问路径springboot如何访问图片
- Linux中对swap分区的配置
- hadoop dfs.datanode.du.reserved 预留空间配置方法
- Docker+nginx+tomcat7配置简单的负载均衡
- 基于PHP规范的自动加载方式(composer配置)
- pygame入门之环境配置
- CentOS6 配置FTP服务器
- C++14系列(1):Linux下C++14开发环境配置
- nginx基于端口的虚拟主机配置实战
- EF 通过DataAnnotations配置属性和类型
- 最新版MacOS系统轻松配置基础依赖库、环境变量、Java、Python、NodeJS等开发环境
- HDP集群日志配置和日志删除脚本
- Windows 64bit下Python环境配置与集成IDE PyCharm
- CentOs7 配置网络