【问题标题】:Working code throwing exception when new lines added. Debugging tips?添加新行时工作代码抛出异常。调试提示?
【发布时间】: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++


【解决方案1】:

我想你想要这样的东西:

const DataType** myData;
GetData(&myData);
const void* strData = myData[0]->strData; 

因为在原始代码中您只是按值传递指针;一个未初始化的指针,然后访问相同的未初始化值。

ed: 修正了第三行

【讨论】:

  • 大部分是真的。以你的方式做,你不会想在第三行取消引用 myData 。但是,这确实简化了我的使用并帮助我找到了我的错误。所以我会将此标记为答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 2016-08-31
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多