2013-11-09 21 views
0

我写了我的malloc实现(让它叫mymalloc(size_t))收集附加信息并保存到列表中。现在我需要重载operator new以使其与mymalloc(size_t)一起使用,而不是malloc(size_t)。在VS2010,我发现这个实现的operator new如何用自定义malloc重载“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!那么我的问题是:如何重载operator newmymalloc作为内存分配函数使其调用构造函数?

回答

6

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

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

+0

谢谢。我以为我知道C++ ... – Netherwire

3

你不需要做一些事来调用构造函数,它会被调用,你的new应该只关心内存。 Example

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; 
} 

输出

新新被称为

Constuctor称为

+0

哇。这是否意味着每个'new'重载都会自动调用构造函数?这对我来说并不明显,因为我可以手动调用析构函数,而不是构造函数。 – Netherwire

+1

重载'new'和'delete'你不应该调用构造函数和析构函数。只管理分配的内存。 [_Here_](http://www.cprogramming.com/tutorial/operator_new.html)是一个很好的解释。 – deepmax

+1

@RomanChehowsky我认为你会在'operator new'和'new X'之间产生混淆。调用'new X'首先调用'operator new'来分配内存。存储分配后,它使用分配的存储作为其位置来调用'X'的构造函数。你不能改变'new X'的行为,但你可以控制'operator new'。 – Charlie

相关问题