从dll / shared-library返回指针会导致seg-fault

时间:2012-04-16 00:05:53

标签: c++ pointers plugins shared-libraries

我正在为程序编写一个小插件系统。它的某些部分已经完成,加载文件并调用构造函数。

在其中一个函数中,我需要将一些(类)指针传递回处理程序,这就是我遇到seg-fault的地方。

程序中的

class RenderInterface {
    public:
        RenderInterface();
        virtual ~RenderInterface();

        void RegisterBufferInterface(BufferInterface* interface)
        {
             bInterface = interface; // <---- this is where segfault occurs
        }
        void RegisterCameraInterface(CameraInterface* interface){}
        void RegisterRenderInterface(RenderInterface* interface){}

        static RenderInterface* GetSingletonPtr()
        {
            return _singleton;
        }

    private:
        static RenderInterface* _singleton;

        BufferInterface* bInterface;
        CameraInterface* cInterface
        RenderInterface* rInterface;
};

RenderInterface :: _ singleton在其他地方设置为0。

注册函数中的

(在dll中):

class BInterface : public BufferInterface {
    public:
        ... various stuff ....
}

class GLPlugin : public Plugin {
    public:
        Plugin() : bInterface(0) {}
        ~Plugin(){}

        void Initialize() // <--- is called after dll has been loaded
        {
            bInterface = new BInterface();

            InterfaceManager::GetSingletonPtr()->RegisterBufferInterface(bInterface); // segfault
            // register other stuff
        }
    private:
        BufferInterface* bInterface;
};

我错过了什么工作?还有其他办法吗?

编辑:在简化代码的同时错过了BufferInterface之后的*,感谢Luchian

1 个答案:

答案 0 :(得分:3)

嗯,它崩溃了,因为你永远不会初始化你的单身人士:

static RenderInterface* GetSingletonPtr()
{
    return _singleton;
}

我假设你在实现文件中初始化_singletonNULL,在这种情况下你需要:

static RenderInterface* GetSingletonPtr()
{
    if ( !_singleton )
        _singleton = new RenderInterface;
    return _singleton;
}

其他一些提示:

  • 在使用单身人士之前评估其他选项
  • 实现析构函数通常意味着您还需要一个复制构造函数和赋值运算符(三个规则)
  • 如果您的班级真的是单身人士,那么构造函数不应该是private吗?
  • bInterface = new BInterface();是非法的,因为bInterface是一个对象,而不是一个指针。