C++内存池

原理就是一个内存池内部拥有的空间为POOL_SIZE个自己。

#include<iostream>

using namespace std;

class DemoClass{
public:
    DemoClass() = default;
    DemoClass(int i):data(i){
        
    }
    static void * operator new(size_t size);
    static void operator delete(void * p);
    virtual ~DemoClass(){}
private:
    DemoClass* next;
    int data;
    static DemoClass* freeMemeHeader; // 保存的是一个内存,但是表示成自己的地址指针
    static const size_t POOL_SIZE;
};

DemoClass* DemoClass::freeMemeHeader = nullptr;
const size_t DemoClass::POOL_SIZE = 24; // 设定内存池能够容纳24个Democlass

void* DemoClass::operator new(size_t size){
    DemoClass* p;
    if(!freeMemeHeader){
        size_t pool_mem_bytes = size * POOL_SIZE; //
        freeMemeHeader = reinterpret_cast<DemoClass*>(new char[pool_mem_bytes]);
        cout<<"Info: 向操作系统申请了"<<pool_mem_bytes<<"字节的内存。"<<endl;
        for(int i=0;i<POOL_SIZE-1;i++){
            // 将内存池中的pool_size小块长连起来
            freeMemeHeader[i].next = &freeMemeHeader[i+1];
        }
        freeMemeHeader[POOL_SIZE-1].next = nullptr;
    }
    p = freeMemeHeader;// 取出内存池链表的头部,分配给要实例化的对象
    cout<<"info: 从内存池中获取了"<<size<<"字节的内存"<<endl;
    freeMemeHeader = freeMemeHeader->next;
    p->next = nullptr;
    return p;
}

void DemoClass::operator delete(void * p){
    DemoClass* temp = (DemoClass*) p;
    temp->next = freeMemeHeader;
    freeMemeHeader = temp;
}

int main(int argc, char* argv[]){
    cout << "sizeof(DemoClass):" << sizeof(DemoClass) << endl;
    size_t N = 32;
    DemoClass* demos[N];
    for(int i = 0; i < N; ++i){
        demos[i] = new DemoClass(i);
        cout << "address of the ith demo:" << demos[i] << endl;
        cout << endl;
    }
    for(int i=0;i<N;i++){
        delete demos[i];
    }
    return 0;
}

相关推荐

  1. C++内存

    2024-04-04 22:38:01       38 阅读
  2. C++实现简单的内存

    2024-04-04 22:38:01       37 阅读
  3. Golang 创建一个简单的内存

    2024-04-04 22:38:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 22:38:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 22:38:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 22:38:01       87 阅读
  4. Python语言-面向对象

    2024-04-04 22:38:01       96 阅读

热门阅读

  1. Vue3 & Vite 整合组件脚手架笔记

    2024-04-04 22:38:01       39 阅读
  2. 速盾:怎么通过cdn防御ddos

    2024-04-04 22:38:01       32 阅读
  3. 为什么资讯网站选择高防IP防护攻击

    2024-04-04 22:38:01       39 阅读
  4. kind+tidb

    kind+tidb

    2024-04-04 22:38:01      31 阅读
  5. Oracle基础

    2024-04-04 22:38:01       23 阅读
  6. [Pytorch]:PyTorch中张量乘法大全

    2024-04-04 22:38:01       29 阅读
  7. 深入Google Cloud Pub/Sub:配置与应用场景解析

    2024-04-04 22:38:01       39 阅读
  8. 如何将txt文件导入hive

    2024-04-04 22:38:01       35 阅读