在看Effective C++,有些疑问,做个笔记找人释惑。
常见的重写operator new的形式和调用形式:
//重写operator new
class MyClass
{
public:
void* operator new(size_t size)
{
...
void *p = malloc(size);
...
return p;
}
};
//调用端
MyClass *p = new MyClass();
几个疑问:
1.调用的new是重写后的new吗?怎么从类类型转换到size_t型的?我做了测试:
size_t MyClass::test_new(size_t obj)
{
return obj;
}
test_new(MyClass());
调用导致编译不过,说明类类型不能隐式转换到size_t。我知道C++默认的new有此功能,new int时会根据类型分配相应大小的内存。重写后的new依然还有此能力吗?还是说:是不是说明调用的new不是重写的operator new,中间还有细节?
2.malloc分配内存但并不会调用类的构造,这个我确认过了,在重写的函数返回之前类的构造都没有被调用。但奇怪的是函数调用完成后马上调用了构造,堆栈里看不到。谁调用的?是不是还是说明调用的new根本就不是重写的operator new?
基于以上2个疑问,我想知道C++是如何对待new的?
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////