1

我编写了我的malloc实现(让它称为mymalloc(size_t)),它收集额外的信息并将其保存到列表中。现在我需要重载operator new以使其与 . 一起工作mymalloc(size_t),而不是malloc(size_t). 在 VS2010 中,我发现了以下实现operator new

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{       // try to allocate size bytes
    void *p;
    while ((p = malloc(size)) == 0)
        if (_callnewh(size) == 0)
        {       // report no memory
             static const std::bad_alloc nomem;
             _RAISE(nomem);
        }

        return (p);
}

请参阅:placement new此代码中没有!那么我的问题是:如何使用 as 内存分配函数进行重载operator newmymalloc使其调用构造函数?

4

2 回答 2

6

operator new()(and )的工作operator new[]()是提供一个指向可以构造对象的内存的指针。这些运算符不会为正在构造的对象调用任何构造函数。事实上,他们甚至不知道为其分配内存的确切类型:即使特定类operator new()被重载,它也会与派生类型一起使用。

请注意,您还需要重载/替换相应的operator delete()and operator delete[]()

于 2013-11-09T22:50:02.223 回答
4

你不需要做任何事情来调用构造函数,它会被调用,你new应该只关心内存。示例

struct A
{
    void* operator new(size_t);
    //void operator delete(void*);

    A()
    {
        cout << "Constuctor is called" << endl;
    }
};

void* A::operator new(size_t size)
{
    cout << "New new is called" << endl;
    void *storage = malloc(size);
    if(0 == storage)
    {
        throw "allocation fail : no free memory";
    }
    return storage;
}

int main()
{
     new A;
}

输出

新新叫

构造函数被称为

于 2013-11-09T22:47:16.590 回答