【问题标题】:C++ class member functions that use dummy parameters使用虚拟参数的 C++ 类成员函数
【发布时间】:2010-09-21 00:22:21
【问题描述】:

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

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

【问题讨论】:

    标签: c++ parameters destructor


    【解决方案1】:

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

    【讨论】:

    • 我很想忘记它,但它会让我烦恼,直到我弄清楚我认为我记得什么。 :-)
    【解决方案2】:

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

    【讨论】:

    • 是的,在我问之前我也检查过(在其他地方)。不过感谢您的回复,这证实了我还没有完全脱离困境。
    【解决方案3】:

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

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

    【讨论】:

    • 我不这么认为,但既然你提到了,它可能与 delete 的特定形式有关,而不是与析构函数本身有关。
    【解决方案4】:

    您可能正在考虑 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;
    }
    

    【讨论】:

    • 啊...是的,我想就是这样。我将不得不进一步研究这个答案,这是我以前不知道的。谢谢!
    【解决方案5】:

    你没疯。我之前肯定在析构函数中看到过 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 *)
    

    【讨论】:

    • 嗯...谢谢,我会看看我能不能用这种方式挖掘一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多