【发布时间】:2020-06-03 01:13:31
【问题描述】:
我正在开发一个专有代码库,所以我必须对其进行抽象。
我正在尝试在 MyApplication 中设置 DataType_T*** myData 的值。我正在使用共享的 c++ 库(我表示库 A)来设置值。共享的 c++ 库只是 C API 的一个简单包装类。C API 作为共享库(我表示为库 B)包含在库 A 中。
所以 MyApplication 在 A 中调用 GetData(myData),在 B 中调用 GetData(myData)。
MyApplication 有以下代码:
void OnButtonPress(){
const DataType*** myData;
GetData(myData);
DataTypeVal1 val1 = (*myData)[0]->val1; // just grabbing some info.
}
GetData(myData):有效,并正确设置 myData。
我:输入一些新代码
void OnButtonPress(){
const DataType*** myData;
GetData(myData);
const void* strData = (*myData)[0]->strData; // just grabbing some info now that we have the pointer.
//Add lots more new code that does this over and over for each member of myData
String^ str = gcnew String(static_cast<const char*>(strData));
}
GetData(myData):引发写访问冲突。
我:“……什么。”
是否会因为某种 dll 卸载而引发异常?
当我输入新代码时,链接过程是否有可能发生变化?
我以前没有遇到过这样的问题,所以我真的不知道如何调试它。
有建议吗?
谢谢。
解决了。 我发现了我未定义的行为。
【问题讨论】:
-
我猜,我会说这是未定义的行为。你在搞乱三重指针和
void*,所以这不足为奇。 -
我知道 C 库已经过单元测试,而且我自己编写了包装器,但它实际上只是将变量传递给 C 库调用,所以我会被引导相信任何未定义的行为只能来自应用程序层,但我作为示例编写的内容非常接近真实应用程序的稀疏性。不过我会继续寻找。
-
找到了。谢谢你的建议。
标签: c++ debugging shared-libraries c++-cli managed-c++