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

时间:2011-10-20 14:27:47

标签: c++ winforms boost clr

这是我第一次使用这样的网站,但我很困难。 包含后面的背景部分是为了完整性,因为我不确定其中描述的任何行为是否可能导致我当前面临的问题。

背景

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

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

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

    问题

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

    _CrtIsValidHeapPointer(pUserData)

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

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

    我有3个问题:

    1. 代码是否正在执行?我知道如果没有执行代码,断言可能会失败。是否有一些事情发生在主要的前面?
    2. / clr和/ clr:纯选项到底意味着什么?
    3. 可以将库升级为clr兼容代码吗?如果是这样,可能会导致链接问题?
    4. 谢谢大家的时间,我没有发布任何代码,因为我确实不知道要发布什么...我不知道问题出在哪里。如果有人建议发布什么代码,我会向他们开放。

      此致 布拉德

2 个答案:

答案 0 :(得分:1)

尝试回答您的具体问题:

  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似乎表明存在一些问题。

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

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

答案 1 :(得分:0)

我知道现在已经很晚了,但我发现了这个问题,因为我遇到了同样的问题。

查看我工作的另一个项目(不是我的),我发现问题来自文件:opencv_ts248d.lib。如果您从您的依赖中删除它,它将正常工作(我不知道为什么,猜测问题出在属于它的函数中),所以您将拥有以下内容:

opencv_calib3d248d.lib
opencv_contrib248d.lib
opencv_core248d.lib
opencv_features2d248d.lib
opencv_flann248d.lib
opencv_gpu248d.lib
opencv_highgui248d.lib
opencv_imgproc248d.lib
opencv_legacy248d.lib
opencv_ml248d.lib
opencv_nonfree248d.lib
opencv_objdetect248d.lib
opencv_ocl248d.lib
opencv_photo248d.lib
opencv_stitching248d.lib
opencv_superres248d.lib
opencv_video248d.lib
opencv_videostab248d.lib

(我只是将所有这些都包括在内,而不是专注于我需要的东西,除了导致问题的那个)

希望它可以帮到你