Общий объект (DLL) вопрос - PullRequest
0 голосов
/ 26 июля 2011

У меня есть вопрос относительно общих объектов (или DLL).Я работаю над загрузчиком плагинов для моего игрового движка.Мне нужно ответить на один вопрос, прежде чем начать делать это.

Если я загружаю данные с помощью внешней функции, могу ли я выгрузить свой общий объект?

Вот небольшой фрагмент кода:

//The Plugin:
class PythonScriptingPlugin : public Plugin {
    void * system;
public:
    PythonScriptingPlugin() {
        system = new PythonScriptingSystem;     
    }

    void * get() { return system; } //derived

};

extern "C" {

    Plugin * libLoadPlugin() {
        return new PythonScriptingPlugin;

    }

}

//main app:
void * loadPlugin() {

    void * handle = dlopen(Base::fs()->file("plugins", "libPythonScriptingPlugin.so"), RTLD_LAZY | RTLD_GLOBAL);
    typedef (void*)(*loader)();
    loader * libLoadPlugin = dlsym(handle, "libLoadPlugin");

    void * data = libLoadPlugin()->get();
    dlclose(handle);
    return data;

}

Будут ли данные разыменовываться при вызове dclose?

1 Ответ

2 голосов
/ 26 июля 2011

Нет, выделенная память остается, но вы не сможете вызвать какую-либо функцию из этого плагина / dll.Это делает ваш объект бесполезным.

...