neicunchi/neicun.cpp

43 lines
1.1 KiB
C++
Raw Normal View History

#include"neicun.h"
#include <iostream>
#include <new> // <20><><EFBFBD><EFBFBD> operator new <20><> operator delete <20>Ķ<EFBFBD><C4B6><EFBFBD>
// <20><><EFBFBD><EFBFBD><ECBAAF>
ThreadSafeMemoryPool::ThreadSafeMemoryPool(size_t blockSize, size_t blockCount)
: blockSize_(blockSize), blockCount_(blockCount) {
init();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
void* ThreadSafeMemoryPool::allocate() {
std::lock_guard<std::mutex> lock(mutex_);
if (freeBlocks_.empty()) {
std::cerr << "Memory pool exhausted!" << std::endl;
return nullptr;
}
void* block = freeBlocks_.back();
freeBlocks_.pop_back();
return block;
}
// <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
void ThreadSafeMemoryPool::deallocate(void* ptr) {
std::lock_guard<std::mutex> lock(mutex_);
freeBlocks_.push_back(ptr);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ThreadSafeMemoryPool::~ThreadSafeMemoryPool() {
for (void* block : allocatedBlocks_) {
::operator delete(block); // ʹ<><CAB9>ȫ<EFBFBD>ֵ<EFBFBD> operator delete <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
}
}
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
void ThreadSafeMemoryPool::init() {
for (size_t i = 0; i < blockCount_; ++i) {
void* block = ::operator new(blockSize_); // ʹ<><CAB9>ȫ<EFBFBD>ֵ<EFBFBD> operator new <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
allocatedBlocks_.push_back(block);
freeBlocks_.push_back(block);
}
}