【问题标题】:"Corruption of the heap" error when returning std::vector<Point> from function从函数返回 std::vector<Point> 时出现“堆损坏”错误
【发布时间】:2013-04-17 08:10:09
【问题描述】:

我面临堆损坏错误:我有一个 dll 和 TestAPP。

  1. vector&lt;Point&gt; vInPts; // 测试应用程序 - 像下面这样转储输入

    vInPts.push_back(Point(730,405));
    vInPts.push_back(Point(319,680));
    vInPts.push_back(Point(292,757));
    vInPts.push_back(Point(318,756));
    vInPts.push_back(Point(726,736));
    vInPts.push_back(Point(344,731));
    
  2. vector&lt;Point&gt; vOutPts;

  3. 调用 DLL -> 将相同的 vInPts 向量复制到 DLL 中的 vOutPts 向量” -> 从该函数返回到 TestApp 时 -> 出现堆错误。现在面临堆错误

如何解决此堆错误?
提前谢谢!!!

【问题讨论】:

  • 你是如何复制到输出向量中的?
  • @juanchopanza 我正在以正确的方式做事,我很确定复制不会成为我的问题。 “我测试了”,即使我只将输入向量传递给 dll 并且对输入向量什么都不做,并且当控件转到 TestAPP 时 - 出现相同的堆错误。
  • 您使用的是哪个运行时?您是否为 dll 和应用程序使用相同的运行时?
  • @TobiasSchlegel 是的,两个运行时都相同。
  • @Pixel:请仔细检查命令行选项(例如,混合/MD/MDd 可能会出现潜在错误)。还要考虑 StackOverflow 上的 this questionrelated answer

标签: c++ dll stl heap-corruption


【解决方案1】:

阅读Point 类的实际定义会很有趣。是否可以正确复制?

此外,由于您使用的是带有 STL 类的 DLL 和 EXE,请确保 DLL 和 EXE 均使用 动态链接 构建到 与 CRT 相同的风格(例如,两者都是使用相同版本的 C++ 编译器构建的,并且具有相同的设置,例如发布构建 DLL 和发布构建 EXE 等)

事实上,STL 类的实现在发布构建和调试构建中有所不同(例如,在调试构建中,诸如迭代器验证等检查的开销更大)。
如果一个 STL 类在 EXE 和 DLL 之间共享,它必须是相同的类,而不是同名但实现不同的类。

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多