Hea*_*eek 2 c++ parameters destructor
我知道你可以使用一个虚拟的"int"参数operator++
并operator--
覆盖这些运算符的后缀版本,但我隐约回想起一些你可以在析构函数上声明的虚拟参数.有谁知道这件事,如果有的话,那个虚拟参数做了什么?
这是我在我十几岁时(即很久以前)读过的旧Turbo C++教程书籍,所以我可能会完全记错了.这也是非常早期的C++,在它被标准化之前,所以它可能是特定于Turbo C++的东西.
您可能正在考虑具有签名的操作员删除的放置和非搬运形式:
void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();
Run Code Online (Sandbox Code Playgroud)
这些在正常操作期间从不被调用,但是在使用placement new构造的对象的构造函数抛出异常的情况下将使用它们.通常你不必定义它们,因为编译器已经在死对象的基础和成员上调用析构函数,而对于新的放置,没有内存可以被释放.但是如果你重载新的并且需要相应的操作符,则可以存在.
第二个参数没有真正使用,只是区分普通的签名:
void operator delete(void *)
Run Code Online (Sandbox Code Playgroud)
但是,这些并不像运算符++那样是特殊的伪参数.它们只是通过额外参数调用new的一般规则的实例,例如:
obj = new(x,y,z) Object(a,b,c)
Run Code Online (Sandbox Code Playgroud)
将生成隐式代码以清除构造函数错误,这些错误将那些相同的附加参数传递给operator delete,它将起作用(近似):
void *raw = operator new(sizeof(Object), x,y,z)
try {
obj = new(raw) Object(a,b,c);
} catch(...) {
operator delete(raw,x,y,z);
throw;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4234 次 |
最近记录: |