我遇到了一个非常令人困惑的现象,试图结合嵌套结构指针参数调用定义为 _declspec(dllexport) 的 borland c++ builder 6 dll 的函数。结构声明包含 AnsiString、std::string 和 std::vector 成员,当我从 bcb6 项目调用 dll 时,它确实有效。不幸的是,当我尝试从 Rad Studio 10.3 项目中调用相同的方法并尝试从向量访问成员时,我确实遇到了访问冲突。试图找出问题的根源,我询问了向量的大小: 在 10.3 中调用之前:1 在 bcb6 中调用之后:大值 > 80000
好像是struct被移位了,否则我无法解释这个奇怪值的原因。在循环期间,确实发生了访问冲突:
int methodCall(const char* val, const A3* data, const char* info)
{
for(std::vector<A2*>::iterator it = data->PersonData.begin(); it !=
data->PersonData.end(); ++it)
{
AnsiString test = it->Name; //access violation
}
}
我确实已经检查了 c++ 编译器对齐,它在两个 IDE 中都设置为四字。
代码是这样的:
struct A1
{
AnsiString Val1;
AnsiString Val2;
std::string S1;
}
struct A2
{
AnsiString Name;
std::string Street;
A1 Details;
}
struct A3
{
AnsiString Val1;
AnsiString Val2;
std::vector<A2*> PersonData;
}
该方法定义如下:
int __declspec(dllexport) __stdcall methodCall(const char* val, const A3* data, const char* info){}
向量是这样填充的:
A3* a3 = new A3;
A2* a2 = new A2;
a2->Name = "Test";
a3->PersonData.push_back(a2);
尝试访问 data->PersonData 的向量元素,例如循环中的 data->PersonData.Name(在迭代器的帮助下),我收到此类错误消息:地址 BC3F2D3E 的访问冲突。读取地址 00000000。
真正让我感到困惑的是,当我在 RAD Studio 中调试相同的代码(使用迭代器等)时,它确实如此,并且它也确实可以与 bcb6<->bcb6 结合使用。这必须是一些编译器问题,但我没有具体的想法。我在 10.3 中使用经典编译器。
我真的很感激任何建议,因为我不知道可能是什么原因。从结构切换到类有帮助吗?