C++ 为什么从DLL加载内存块只会在第二次调用memmove时崩溃?

C++ 为什么从DLL加载内存块只会在第二次调用memmove时崩溃?,c++,pointers,dll,segmentation-fault,C++,Pointers,Dll,Segmentation Fault,这就是问题中的类(只有与这个问题相关的函数)和它所依赖的一切(都是我自己写的)。它提供了一个DLL接口 struct MemRegion{ const uint64_t地址; const uint64_t size; }; 枚举版本{ 我们的版本, 版本(JP) }; 常量结构MemRegion段[2][2]={ {{1302528, 2836576}, {14045184, 4897408}}, {{1294336, 2406112}, {13594624, 4897632}}, }; 使用插

这就是问题中的类(只有与这个问题相关的函数)和它所依赖的一切(都是我自己写的)。它提供了一个DLL接口

struct MemRegion{
const uint64_t地址;
const uint64_t size;
};
枚举版本{
我们的版本,
版本(JP)
};
常量结构MemRegion段[2][2]={
{{1302528, 2836576},
{14045184, 4897408}},
{{1294336, 2406112},
{13594624, 4897632}},
};
使用插槽=阵列;
班级游戏{
私人:
版本m_版本;
hmodulem_动态链接库;
常量MemRegion*m_区域;
公众:
游戏(版本,cstr dll_路径){
m_版本=版本;
m_dll=LoadLibraryA(dll_路径);
如果(m_dll==NULL){
unsigned int lastError=GetLastError();

cerr我发现
HMODULE
相当于
void*
。因为你不能在
void*
s上真正使用指针算法,你必须将它转换为
uint8\u t*
或等效值才能正确获得偏移量

以下是实际情况:

void save_状态(插槽和插槽){
uint8_t*常数dll=(uint8_t*)((void*)m_dll);
对于(int i=0;i<2;i++){
MemRegion段=m_区域[i];
std::vector&buffer=slot[i];
memmove(&buffer[0],_dll+segment.address,segment.size);
}
}

调试器会说什么?缓冲区是否足够大?是否是可读部分中的
m_dll+区域的结果。地址
缓冲区被初始化为足够大以容纳所需的内存。此外,这是一个端口,原始Python版本使用基本相同的东西来访问数据。@ssbssa I've al因此,尝试将缓冲区大小增加65536,它不会改变任何东西。也许这会有所帮助:如果您有gdb 10,
p$\u siginfo
会为您提供分段错误的详细信息。编译器应该已经为您捕捉到这一点并给出一个错误。在您的环境中,
HMODULE
的定义是什么?应该是什么比如“指向不完整类型的指针”,指针算法不可能在其上执行,并且尝试
m_dll+区域。地址
将是一个编译错误。我搜索了MinGW-w64的文件:
HMODULE
被类型定义为
HANDLE
,它被类型定义为
PVOID
,最后被类型定义为
void*
。但是有多个
声明DLE
宏,这可能会使某些事情发生错误。通常应设置
STRICT
,并使各种
句柄
类型都成为指向正向声明(因此不完整)结构的指针的typedef。至少官方的Microsoft Header是这样做的。但mingw版本可能会采用快捷方式。。。
Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ffac2164452 in msvcrt!memmove () from C:\Windows\System32\msvcrt.dll