2011-08-24 97 views
6

我知道应该有一个删除操作符,我不关心某个地方。我只是想知道,哇,它工作。参数“size”来自哪里?`尺寸'来自哪里?

#include<iostream> 
#include<string> 

class Base { 
public: 
    Base() { } 
    void *operator new(unsigned int size, std::string str) { 
    std::cout << "Logging an allocation of "; 
    std::cout << size; 
    std::cout << " bytes for new object '"; 
    std::cout << str; 
    std::cout << "'"; 
    std::cout << std::endl; 
    return malloc(size); 
    } 
private: 
    int var1; 
    double var2; 
}; 

int main(int argc, char** argv){ 
    Base* b = new ("Base instance 1") Base; 
} 

下面是结果:

测井的新对象“基本实例1”

+2

您正在看一些f空气先进的C++功能。作为初学者,你应该关注更基本的东西。 – user763305

+0

由于对齐,填充和其他开销,请注意,对象的大小和分配的字节数可能会有所不同!尤其适用于阵列。不要以为这个对象被放置在你新操作员返回的地址,因为它可能不是! – Frigo

+0

其实从标准5.3.4/12开始:“新T导致operator new(sizeof(T))的调用”。如果你想要任何特殊的路线,你必须自己提供,对象将被放置在从新路线返回的地址。 –

回答

12

它是通过在编译时,编译器提供16个字节的分配。当编译器看到:

new ("Base instance 1") Base; 

它会添加一个调用:

Base::operator new(sizeof(Base), "Base instance 1"); 

编辑:编译器当然还呼吁增加Base::Base()

+0

你太棒了,谢谢!令人惊讶的。我改变了代码,并得到一个错误:'新运营商'的第一个形式参数必须是'size_t'。现在我知道更多有关new.Thanks再次。 – Mike

0

在32位拱INT是4个字节,double是8,但是double将对齐到8个字节的边界,所以size = 4 + 4(空格)+ 8 = 16

+0

问题不在于该类型的大小是如何形成的,而是关于新的大小参数以及从哪里填充 – PlasmaHH