我有一个从接口派生的类
class Interface {
public:
virtual void foo() = 0;
};
class Implementer : public Interface {
public:
void foo() override { std::cout << "Hello world" << std::endl; }
private:
int __some_int_member;
};
现在我想编写一个程序,它将Implementer
在所有应用程序实例中获取相同的类实例。我按照此处建议的示例(第二个)进行操作,但在该示例中,仅使用了一个字节。
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
Implementer *impl = nullptr;
QSystemSemaphore accessor("app_accessor", 1);
accessor.acquire();
#ifndef QT_OS_WIN
QSharedMemory mem_fix("my_class");
if(mem_fix.attach())
{
mem_fix.detach();
}
#endif
QSharedMemory mem("my_class");
if(!mem.attach())
{
mem.create(sizeof(Implementer));
new(mem.data()) Implementer();
}
impl = (Implementer*)mem.data();
accessor.release();
impl->foo();
return app.exec();
}
第一个实例工作正常。但是第二个上线就崩溃了impl->foo()
。
我认为原因是void*
从Implementer*
. 但我不知道如何正确地做到这一点。
有什么建议么?
编辑
我意识到,由分段错误引起的崩溃是继承的结果,因为没有基类,一切正常。
编辑 2
经过一些调试、内存转储和一些注释后,我意识到问题在于,在运行时程序的第一个实例vtable
在其堆栈中创建了 并将其vptr
放入vtable
. 第二个实例得到相同的vptr
结果,不幸的是,它指向一些随机内存(可能已分配或未分配)。