重载新运算符

时间:2018-01-19 09:59:42

标签: c++ segmentation-fault new-operator

我正在尝试创建一个内存池并重载新的运算符,所以我在程序开头编写了一堆地址

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上运行

0 个答案:

没有答案