如果我定义的operator delete如下,如果在新的表达式对象的构造函数抛出我期望看到在调用定义的运算符的结果删除:当对象构造函数引入新表达式时,为什么不调用分配函数?
#include <new>
#include <cstdlib>
#include <iostream>
void*
operator new(std::size_t s){
std::cout << "alloc " << std::endl;
return std::malloc(s);
}
void
operator delete(void* p) noexcept {
std::cout << "dealloc " << std::endl;
std::free(p);
}
void
operator delete(void* p,std::size_t) noexcept{
std::free(p);
std::cout << "dealloc s" << std::endl;
}
struct A{
A(int i){
if(i>0)
throw 10;
}
};
int main(int argc// will equal 10
,char* arg[])
{
for(int i=0;i<argc;++i)
auto p=new A{argc};
return 0;
}
这个程序只是输出alloc
,为什么运营商删除不叫?在标准的[expr.new]它被指定的是:
如果上述对象初始化的任何部分通过抛出异常和合适 释放函数可以发现终止,解除分配函数被调用,以自由其中正在构造对象 的内存,之后异常继续在新表达式的上下文中传播。
您没有try catch块。 – Jarod42
@ Jarod42你是对的!谢谢!我需要catch catch,因为生活的主要功能是UB,还是出于其他原因? – Oliv
这是UB部分。顺便说一句,'return i;'是无效的('i'超出了范围)。 – Jarod42