我知道你可以使用一个虚拟的“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();

在正常操作期间从不调用它们,但是在使用 placement new 抛出异常。通常你不必定义它们,因为编译器已经在死对象的基础和成员上调用析构函数,而对于新的放置,没有内存可以被释放。但是,如果您要重新放置新位置并需要相应的运算符,则可以存在。

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

void operator delete(void *)

然而,这些不是运算符++那些特殊的伪参数。它们只是一般规则的一个实例,它使用额外的参数调用new,例如:

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

将生成隐式代码以清除构造函数错误,这些错误将这些相同的附加参数传递给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;
}

其他提示

要么你是错误的记忆,要么你应该试着忘掉它。析构函数没有参数,返回类型,也不应该抛出异常。

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

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

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

char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;

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

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

$ cxx foo.cxx

$ type [.CXX_REPOSITORY]cxx$demangler_db.
CX3

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

<*>ZN3FOOD1EV31GNTHJ foo::$complete$~foo() CX3

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

<*>ZN3FOOD2EV30KQI3A foo::$subobject$~foo() CX3

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

<*>ZN3FOOD9EV36HH9SB foo::~foo(int) CXXL

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

<*>ZDLPV void operator delete(void *)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top