我正在尝试创建一个内存池并重载新的运算符,所以我在程序开头编写了一堆地址
MemPool类中的分配:
void MemPool::initialize(int size) {
charArray = (char*)malloc(size);
currentAddress = charArray;
lastAddress = charArray + size;
}
这是我的Main.cpp:
MemoryManager mm;
int main(int argc, char *argv[]) {
Object* obj1 = new Object();
}
Operators.cpp
extern MemoryManager mm;
void* operator new(size_t size) {
void* chunk = mm.getAChunk(size);
return chunk;
}
这是我的getAChunk方法:
void* MemoryManager::getAChunk(int size) {
char* chunkToReturn = nullptr;
int power = ceil(log2(size));
int storageSpace = pow(2,power);
Block* poppedBlock = freeList[power].popFirstBlock();
if (poppedBlock==nullptr) {
int sizer = mPool->getLastAddress() - mPool->getCurrentAddress();
if ( sizer > storageSpace+sizeof(Block) ) {
char* currAddress = mPool->getCurrentAddress();
Block* block = (Block*)currAddress;
block->setPower(power);
block->setNextBlock(nullptr);
currAddress += sizeof(Block);
chunkToReturn = currAddress;
mPool->incrementCurrentAddress(storageSpace+sizeof(Block));
} else {
cout << "- Could not allocate space -" << endl;
}
} else {
cout << "Using existing block " << endl;
char* addrToReturn = (char*) poppedBlock;
addrToReturn += sizeof(Block);
chunkToReturn = addrToReturn;
}
return chunkToReturn;
}
上面的代码有效,当我尝试创建一个比我的内存池大的新Object时,它将按预期打印“无法分配空间”。 但是,一旦我向Object的构造函数添加了一个数字:
Object* obj1 = new Object(5);
然后,当我尝试创建一个大于我的内存池的Object时,我会遇到分段错误。 代替我创建的新对象时会出现同样的情况:
double* d1 = new double; // does not cause segmentation fault.
double* d1 = new double(); // causes a segmentation fault.
My Object类只是一个简单的类:
class Object {
int num;
int sum;
double sam;
public:
Object() {}
Object(int num) { sum = num; }
void print() { cout << " This is an object " << endl;}
};
///////////////////////////////////////// 编辑:
要检查段错误发生的位置,我添加了这个cout:
void* operator new(std::size_t size) {
void* chunk = mm.getAChunk(size);
if (chunk == nullptr) {
cout << "1" << endl;
return chunk;
}
cout << "2" << endl;
return chunk;
}
我已经创建了足够小的池,以便getAChunk将返回nullptr。 当我创建一个没有括号的double时,它将打印“1”并返回没有任何问题,但在我添加括号后,它将打印“1”并在return语句中导致分段错误。 我假设segfault发生在自
之后的return语句中double* d1 = new double(4);
我尝试了一种不打印的简单打印
如果重要,我的代码在c9.io上运行