我看到以下结构:
new X
将释放内存,如果X
构造函数抛出。
operator new()
可以超载。
运算符 new 重载的规范定义是void *operator new(size_t c, heap h)
以及相应的operator delete
.
最常见的operator new重载是placement new,即void *operator new(void *p) { return p; }
你几乎总是无法打电话delete
在指定放置的指针上new
.
这引出了一个问题:当X
构造函数抛出和重载new
用来?
从根本上来说,如果没有delete
对应于的运算符new
运算符,则什么也不做。在放置 new 的情况下也不执行任何操作,因为相应的放置删除运算符是无操作。异常不会被转移:它会继续其进程,因此 new 的调用者有机会(和责任)释放分配的内存。
之所以称为 Placement new,是因为它用于将对象放置到以其他方式获取的内存中;由于 new 运算符没有获取内存,因此 delete 运算符不太可能释放它。在实践中,这个问题是没有意义的,因为(至少从 C++03 开始)不允许替换放置新运算符(其原型operator new(size_t, void*)
或删除(operator delete(void*, void*)
)。提供的放置新运算符返回其第二个参数,并且提供的放置删除运算符是无操作。
Other new
and delete
运算符可以被替换,无论是全局的还是针对特定类的。如果定制new
操作符被调用,构造函数抛出异常,并且有对应的delete
运算符,然后在传播异常之前将调用该删除运算符进行清理。但如果没有对应的则不是错误delete
操作员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)