c++ - 使用 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;
}
解决方案
推荐阅读
- angular - Is there any way to get nzshowsearch to be case insensitive?
- javascript - 停止从 iframe 重定向
- amazon-web-services - AWS Step Function 卡在某个状态
- c++ - 无法将打包字段“st.ST::a”绑定到“int&”
- c# - 如何重构这个 if-else 条件以使其更清洁、更高效?
- jmeter - JMeter 报告 - 在示例元数据中找不到列 <"VarName">
- java - 在将数据发送到 Firebase 之前,我可以将 android 电池电量信息添加到我的位置吗?
- java - RabbitMQ 慢消费者导致 Spring Boot RabbitMQ 集成中的队列堆积
- reactjs - 如何将测试用例写入反应js中UseEffect中的if Condition
- ios - Webex IOS SDK 初始化不返回回调