gpt4 book ai didi

c++ - 如何修复 C++ winforms 应用程序中的 _CrtIValidHeapPoint(pUserData) 断言失败

转载 作者:太空狗 更新时间:2023-10-29 23:08:52 25 4
gpt4 key购买 nike

这是我第一次使用这样的网站,但我被深深地卡住了。为了完整起见,包含了随后的背景部分,因为我不确定其中描述的任何操作是否会导致我当前面临的问题。

背景

我和一位同事在 visual studio 2010(完整版)的控​​制台应用程序(具有默认设置)中为大学作业编写了大量 C++ 代码。我们决定要试试 winforms 应用程序,因此在 visual studio 2010 中创建了一个,并从控制台应用程序导入了所有代码。我们遇到了以下问题:

  1. 需要在“stdafx.h”文件中添加我们的包含,然后在我们所有的实现文件(.cpp)中添加#include“stdafx.h”。
  2. 在我们使用 C++ 字符串 (std::string) 的地方,我们不得不更改为托管系统字符串 (System::String^) 以实现 CLR 兼容性。
  3. 将“公共(public)语言运行时支持”编译选项更改为/clr 而不是/clr:pure。这是解决我们在 boost::shared_ptr 中遇到的链接错误(LNK2028、LNK2019)所必需的……

完成上述工作后,我们的项目正在编译。

问题

当我们运行应用程序时,我们得到以下断言失败:

_CrtIsValidHeapPointer(pUserData)

这个断言立即失败,似乎没有任何代码被执行,因为当我在 main 的开始设置断点时,它们在调试中没有到达(调用堆栈是空的)。

我能够让应用程序运行的唯一方法是将 CLR 选项设置为/clr:pure 并删除所有对 boost 的使用。

我有 3 个问题:

  1. 代码是否正在执行?我知道如果没有执行代码,断言可能会失败,这听起来是不可能的。可能在 main 之前发生了什么?
  2. /clr 和/clr:pure 选项的真正含义是什么?
  3. 可以将 boost 库编译为 clr 兼容代码吗?如果是这样,什么可能导致链接问题?

谢谢大家花时间,我没有发布任何代码,因为我真的不知道要发布什么...我不知道问题出在哪里。如果有人对发布什么代码有建议,我欢迎他们。

问候布拉德

最佳答案

尝试回答您的具体问题:

  1. main()您的 代码的入口点,而不是整个可执行文件。可能有大量样板初始化以及初始化所有全局静态对象。例如,在下面的例子中,函数在进入 main 之前运行:

       int SomeGlobal = SomeFunction();

    int main (void)
    {
    ...
    }
  2. 我对/clr 的经验几乎为零,但我可以为您指出一些有用的引用资料。确保您了解 How To Migrate to /clr 中适用于您的所有内容和 /clr settings .

  3. 我也没有直接的知识,但this forum post on boost::shared_ptrthis SO question on boost::thread似乎表明存在一些问题。

为了进一步诊断问题,我会尝试一些事情:

  • 从一个空的或“hello world”CLR 项目开始,以确保它可以编译和运行。
  • 使用 boost 尝试一个简单的示例,看看它是否完全有效或是否重现该问题。
  • 尝试清理并完全重建您的应用程序。
  • pUserData 可能来自 CString 析构函数。确保所有字符串都迁移到托管系统字符串。
  • 如果您的简单示例有效,那么只需添加示例直到问题重现,或者从您的应用程序中删除内容直到问题消失。

关于c++ - 如何修复 C++ winforms 应用程序中的 _CrtIValidHeapPoint(pUserData) 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7837454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com