【发布时间】:2021-11-09 00:50:35
【问题描述】:
我遇到了一个非常令人困惑的现象,试图结合嵌套结构指针参数调用定义为 _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 中都设置为 quad word。
代码是这样的:
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 中调试相同的代码(使用迭代器等)时,它确实如此,并且它也确实可以与 bcb6bcb6 结合使用.这必须是一些编译器问题,但我没有具体的想法。我正在使用 10.3 中的经典编译器。
我非常感谢任何建议,因为我不知道可能是什么原因。从结构切换到类有帮助吗?
【问题讨论】:
-
不分享有问题的代码和确切的错误,我们只能盲目猜测
-
@CoryKramer:我已经编辑了我的帖子,如果需要任何进一步的信息,我会尝试扩展我的问题。
-
你能说明
PersonData是如何填充的吗?那么导致你描述的错误的循环呢? -
我希望添加的信息对您有所帮助。
标签: c++ unicode rad-studio declspec