我正在尝试解决类似于以下代码的一些奥秘:

struct Interface {
    virtual void f () = 0;
}

struct SomeClass {
    virtual void additionalBehaviour () = 0;
    void g () {
        additionalBehavoiur ();
        /*Some stuff with printing into a ostringstream*/
    }
}

struct Derived : public SomeClass, public Interface {
    void additionalBehaviour () { /*Some printing to oss*/ }
    void f () { g (); }
}

int main () {
    unique_ptr<Interface> ifc (new Derived ());
    ifc->f ();
    cout << "HI!" << endl;
    return 0;
}

它可以工作,但会退出并随机退出,在Windows上完成部分g ()中列出的操作并打印出“HI!”,从而导致с00000050a9e appcrash。
因此,在某个时候它停止打印到文件中,完成其他所有操作,最后崩溃。某个点实际上意味着某个点:例如,file << "phrase"可能会生成phra,此后什么也没有。
此外,它可以正确执行,并且在GDB中执行时不会崩溃。根据Memory博士的说法,没有内存泄漏。

解决方案:
struct Derived : public Interface, public SomeClass {
    void f () { g (); }
}

问题:为什么?!
我想这与类中相对字段的位置有关,但是在GDB中没有崩溃又没有任何内存问题的迹象呢?

最佳答案

似乎该问题与您没有虚拟析构函数有关。这就是执行g()中的处理的原因:当unique_ptr销毁对象时发生崩溃。

像这样它应该工作:

struct Interface {
    virtual void f () = 0;
    virtual ~Interface() {};
};

Online demo

标准引用:

09-08 00:31