C++ 手写简易内存池

C++手写内存池,原理:

申请一大块内存,切分成多个小块内存,各个小块内存用链表串连起来;

freeList就是链表头。

每次需要内存时,从链表头拿走一块空闲内存,链表头向后移动。

每次归还内存时,链表头指向归还的内存,这块归还的内存则指向原来的链表头。

相当于插入和删除都是从链表头进行的。

#include <iostream>
using namespace std;

class MemoryPool {
private:
    struct Block {
        Block* next;
    };
    Block* freeList;
    void *pool;
    size_t blockSize;
    size_t blockCount;
public:
    MemoryPool(int blockSize, int blockCount): freeList(nullptr), pool(nullptr), blockSize(blockSize), blockCount(blockCount) {
        if (blockSize < sizeof(Block)) {
            blockSize = sizeof(Block);
        }
        pool = ::operator new(blockCount * blockSize);
        char *start = static_cast<char *>(pool);
        for (size_t i = 0; i < blockCount; ++i) {
            Block *block = reinterpret_cast<Block *>(start + i * blockSize);
            block->next = freeList;
            freeList = block;
        }
    }
    ~MemoryPool() {
        ::operator delete(pool);
    }
    void* allocate() {
        if (!freeList) {
            throw std::bad_alloc();
        }
        Block* block = freeList;
        freeList = freeList->next;
        return block;
    }

    void deallocate(void *ptr) {
        Block* block = static_cast<Block*>(ptr);
        block->next = freeList;
        freeList = block;
    }
};

struct MyObject {
    int x, y;
};

int main() {
    MemoryPool pool(sizeof(MyObject), 10);
    void *mem = pool.allocate();
    MyObject *obj = new(mem) MyObject{1, 2};
    std::cout << obj->x << ", " << obj->y << std::endl;
    // 手动析构 + 归还内存
    obj->~MyObject();
    pool.deallocate(obj);
    return 0;
}
感谢阅读!如有疑问请留言
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇