首页 > 解决方案 > 使用 Linux 时 boost::shared_ptr 似乎消失了

问题描述

我正在使用 boost::shared_ptr 指向插件类。插件是一个地图 <string, shared_ptr>。我第一次在地图中找到某个插件时,它工作正常。但是,以后每次尝试查找特定插件时,都会收到 SIGSEGV 错误。单步执行我的代码时,我foundPlugin = a->second->onCommand(command);发现 a->second 不再可访问。但是,仅当我在 Linux 中运行时才会发生此错误。在 Windows 中运行时我没有任何问题。boost::shared_ptr 和 linux 有什么问题吗?我曾尝试使用 std::shared_ptr,但我必须使用返回 boost::shared_ptr 的 boost::dll::import 函数,但我还没有找到替代方法。非常感谢任何见解!

我加载这样的插件:

bool PluginManager::loadPlugin(std::string pluginPath, std::string 
                               pluginName, std::string pluginType)
{
    bool couldLoad = false;
    boost::filesystem::path libPath = boost::filesystem::current_path(); 
    boost::shared_ptr<my_plugin_api> plugin; 

    std::cout << "Loading the plugin " << pluginName << std::endl;

    if (pluginName == "")
    {
        pluginName = "plugName";
    }

    try
    {
        plugin = boost::dll::import<my_plugin_api>(                    
        libPath / pluginName,                           
        pluginType,                                     
        dll::load_mode::append_decorations              
        );

        Plugin.insert(std::pair<std::string,boost::shared_ptr<my_plugin_api>> 
        (pluginName, plugin));
        std::cout << "Loading the plugin " << pluginName << " (SUCCESS)" << 
        std::endl;
        couldLoad = true;
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return couldLoad;
}

经过更多的测试,我觉得我的问题出在上面的代码部分。boost::dll::import 函数的行为就像它找到了一个 .so,但在 boost::shared_ptr 中没有返回任何内容,这反过来又导致第二段代码失败。关于为什么这个 boost::dll::import 函数在 Linux 中的行为可能很奇怪的任何想法?

bool PluginManager::onCommand(const char* command, const char* pluginName)
{
    bool foundPlugin = false;

    auto a = Plugin.find(pluginName);
    if (a == Plugin.end())
    {
        std::cerr << "plugin " << pluginName << " not found" << std::endl;
    }
    else
    {
        foundPlugin = a->second->onCommand(command);
    }

    return foundPlugin;
}

标签: c++linuxboost

解决方案


推荐阅读