如果我们调用operator new和operator delete的不同形式会发生什么?
class A
{
public:
void* operator new ( std::size_t count, const char* msg );
};
void* A::operator new ( std::size_t sz, const char* msg ){
std::printf("global op new called, message = %s",msg);
return std::malloc(sz);
}
int main(){
A *a = new ("message") A;
delete a;
}
在这种情况下,程序是否有UB?什么是标准谈论这个?
答案 0 :(得分:3)
是的,您的代码在很多方面都有未定义的行为。
一般而言,除非发布形式与分配形式相符,否则结果是未定义的。这包括运营商新形式的不匹配。 (新的安置有点特殊和不同,但我不会去那里)。
此外,原始帖子下方OP的评论100%不正确。不要求任何形式的operator new
或operator delete
使用malloc()
和free()
(或相关函数)。因此,语句delete a
具有未定义的行为,因为这意味着使用全局malloc()
释放使用operator delete()
分配的内存。