C++中重写operator new后详细的内部运行机制是怎么样的?

本文探讨了C++中重写operator new的内部运行机制,针对调用new时是否使用重写版本以及构造函数的调用时机产生疑问。经过测试和讨论,了解到构造函数的调用是编译器实现的,并且即使重写了全局的operator new,类中的operator new仍然会被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看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的?


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值