使用伪参数的C ++类成员函数

时间:2008-11-06 02:27:33

标签: c++ parameters destructor

我知道您可以在operator++operator--上使用虚拟“int”参数来覆盖这些运算符的后缀版本,但我模糊地回忆一下您可以声明的虚拟参数析构函数。有没有人知道这件事,如果有,那个虚拟参数做了什么?

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

5 个答案:

答案 0 :(得分:6)

您可能正在考虑具有签名的操作员删除的放置和非搬运形式:

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;
}

答案 1 :(得分:5)

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

答案 2 :(得分:2)

我发誓我听过同样的话,但C++ FAQ seems to say that there is no such form

答案 3 :(得分:2)

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

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

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

答案 4 :(得分: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 *)