2

我知道您可以使用虚拟“int”参数operator++operator--覆盖这些运算符的后缀版本,但我隐约记得您可以在析构函数上声明的虚拟参数。有谁知道这一点,如果知道,那个虚拟参数做了什么?

这是在我十几岁时(即很久以前)阅读的旧 Turbo C++ 教程书籍中,所以我可能完全记错了它。那也是非常早期的 C++,在它被标准化之前,所以它可能是 Turbo C++ 特有的。

4

5 回答 5

6

您可能正在考虑 operator delete 的放置和 nothrow 形式,它们具有以下签名:

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();

这些在正常操作期间从不调用,但会在使用placement new构造的对象的构造函数引发异常的情况下使用。通常你不必定义它们,因为编译器已经在死对象的基类和成员上调用了析构函数,并且对于放置 new 没有要释放的内存。但是如果您重载placement new 并且需要相应的运算符,则可以存在。

第二个参数并没有真正使用,只是区分普通的签名:

void operator delete(void *)

不过,这些不是 operator++ 的特殊虚拟参数。它们只是使用额外参数调用 new 的一般规则的一个实例,例如:

obj = new(x,y,z) Object(a,b,c) 

将生成隐式代码以清除将这些相同的附加参数传递给运算符 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;
}
于 2008-11-06T03:29:58.537 回答
5

要么你记错了,要么你应该试着忘记它。析构函数没有参数、返回类型,它们不应该抛出异常。

于 2008-11-06T02:31:30.183 回答
2

我发誓我听说过同样的事情,但C++ FAQ 似乎说没有这种形式

于 2008-11-06T02:33:32.470 回答
2

也许您正在考虑安置新的?

class MyClass { /* ... */ };

char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;
于 2008-11-06T02:44:32.980 回答
1

你没疯。我之前肯定在析构函数中看到过 int 参数。在 OpenVMS 上使用 HP 的编译器,我编译了一个示例程序,如下所示。符号列表确实包含一个带有 int 参数的析构函数。我只能猜测这是特定于编译器的。

$ create foo.cxx
class foo
{
 ~foo() {}
};

$ cxx foo.cxx

$ type [.CXX_REPOSITORY]cxx$demangler_db.
CX3$_ZN3FOOD1EV31GNTHJ         foo::$complete$~foo()
CX3$_ZN3FOOD2EV30KQI3A         foo::$subobject$~foo()
CX3$_ZN3FOOD9EV36HH9SB         foo::~foo(int)
CXXL$_ZDLPV                    void operator delete(void *)
于 2008-11-19T03:02:20.170 回答