Shared_ptr Segfault после возврата - PullRequest
0 голосов
/ 03 апреля 2020

У меня возникла проблема, когда я пытаюсь сохранить необработанный указатель в shared_ptr, и когда я возвращаю свой shared_ptr, я не могу использовать свой объект. Мой необработанный указатель получен из общей библиотеки.

Parser::ParserPtr Generator::Core::loadParser(const std::string &path) const noexcept {
    LibHandler::DynamicLoader dl;

    auto handler = dl.load(path);
    if (!handler) {
        BOOST_LOG_TRIVIAL(error) << "Failed to load parser. File: " << path;
        return nullptr;
    }

    auto foo = dl.getFunction<Parser::ParserInstanceFunction>(handler, "CreateParser");
    if (!foo) {
        BOOST_LOG_TRIVIAL(error) << "Failed to load parser function. File: " << path;
        return nullptr;
    }

    auto parser = Parser::ParserPtr((*foo)(), [](auto p){
        std::cout << "Delete pointer" << std::endl;
    });
    if (!parser) {
        BOOST_LOG_TRIVIAL(error) << "Failed to create instance of IParser. File: " << path;
        return nullptr;
    }

    std::cout << parser->getName() << std::endl;
    return std::move(parser);
}

Так что здесь parser->getName() работает.

int Generator::Core::start(const std::string &parserPath) const noexcept {    
        auto iParser = this->loadParser(parserPath);
        if (!iParser)
            return EXIT_FAILURE;
        std::cout << typeid(iParser).name() << std::endl;
        std::cout << iParser->getName() << std::endl;

    }
    return EXIT_SUCCESS;
}

Здесь нет ... Я не понимаю, почему.

Чтобы экспортировать мою функцию в моей библиотеке, я использую:

#ifndef EXTERN_C
# ifdef __cplusplus
#  define EXTERN_C extern "C"
# else
#  define EXTERN_C extern
# endif
#endif

#if defined(SYS_LINUX) || defined(SYS_DARWIN)
# define EXPORT
#elif defined(SYS_WIN)
# define EXPORT __declspec(dllexport)
#endif
PARSER_MAKE_ENTRY_POINT(class) EXTERN_C EXPORT Parser::IParser *CreateParser() { return new class(); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...