C++ 使用共享库中RAM中的可执行堆栈区域

C++ 使用共享库中RAM中的可执行堆栈区域,c++,linux,C++,Linux,我只是遇到了一个问题,我不知道我的答案是否正确,所以我感谢任何帮助或建议 我正在写一个可插拔的应用程序。因此,假设我在共享库中的plugin类中有一个方法,比如(我用堆指针从MyPlugin类创建了一个对象,并简单地调用这个方法来给我一些关于自身的信息)如下: 我从可执行文件的一部分调用它,但在插入行中我得到信号:SIGSEGV(分段错误) 这就是它的用途: Packet_types packetTypes; my_plugin->getPacketTypes(packetTypes);

我只是遇到了一个问题,我不知道我的答案是否正确,所以我感谢任何帮助或建议

我正在写一个可插拔的应用程序。因此,假设我在共享库中的plugin类中有一个方法,比如(我用堆指针从
MyPlugin
类创建了一个对象,并简单地调用这个方法来给我一些关于自身的信息)如下:

我从可执行文件的一部分调用它,但在插入行中我得到信号:SIGSEGV(分段错误)

这就是它的用途:

Packet_types packetTypes;
my_plugin->getPacketTypes(packetTypes);
for (const Packet_type &packetType:packetTypes) {
    all_ok = all_ok && plug(plugin, packetType);
}
我只是想这可能是因为您无法从运行时加载的共享库访问主应用程序的堆栈RAM区域,是吗?

OMG!笨蛋

谢谢你们,没有你们我做不到!因为我一直在思考我的想法(“您不能从运行时加载的共享库访问主应用程序的堆栈RAM区域”)

问题就在这里:

 void MyPlugin::getPacketTypes(Packet_types &packets) {
      packets.insert(this->handled_packets.begin(),this->handled_packets.begin(),this->handled_packets.end());
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 }
第一个参数是指向错误对象的指针

应该是:

void ClipboardPlugin::getPacketTypes(Packet_types &packets) {   
     packets.insert(packets.begin(),handled_packets.begin(),handled_packets.end());
}

结论:这是完美的,因此我相信@NateEldredge在注释中是正确的

线程只有一个堆栈,任何函数都可以访问堆栈上的任何对象,只要给它一个指针。不管该函数是从主二进制文件还是从共享库加载的。你的错误是另外一回事。@tadman是的,我有,它发生在标准库中!当这种情况发生时,使用回溯跟踪(有时称为调用堆栈)返回代码并检查传递到库调用的内容。通常,这就是您开始查找有用的调试信息的地方。@user4581301最后执行的代码(属于我)是getPacketTypes函数中的insert调用
void ClipboardPlugin::getPacketTypes(Packet_types &packets) {   
     packets.insert(packets.begin(),handled_packets.begin(),handled_packets.end());
}