这是我第一次使用这样的网站,但我陷于困境。
为了完整起见,下面的背景部分是完整的,因为我不确定其中描述的任何操作是否可能导致了我当前面临的问题。

背景

我和一位同事在Visual Studio 2010(完整版)的控​​制台应用程序(具有默认设置)中编写了很多C++代码,用于大学分配。我们决定要尝试使用Winforms应用程序,因此在Visual Studio 2010中创建了一个应用程序,并从控制台应用程序导入了所有代码。我们面临以下问题:

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

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

    问题

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

    _CrtIsValidHeapPointer(pUserData)

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

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

    我有3个问题:
  • 代码正在执行吗?我知道在没有执行代码的情况下断言失败是不可能的。在main之前是否发生了某些事情?
  • / clr和/ clr:pure选项的真正含义是什么?
  • 是否可以将boost库编译为与clr兼容的代码?如果是这样,什么可能导致链接问题?

  • 谢谢您的宝贵时间,我没有发布任何代码,因为我实际上不知道要发布什么...我不知道问题出在哪里。如果有人对发布什么代码有建议,我欢迎他们。

    问候
    布拉德

    最佳答案

    尝试回答您的特定问题:

  • main()是代码的入口点,而不是整个可执行文件。可能会有大量的样板初始化以及所有全局静态对象的初始化。例如,在以下示例中,该函数在输入main之前运行:
       int SomeGlobal = SomeFunction();
    
       int main (void)
       {
       ...
       }
    
  • 我对/ clr的经验几乎为零,但我可以为您提供一些有用的引用。确保您了解How To Migrate to /clr/clr settings中适用于您的所有内容。
  • 我仍然没有直接的知识,但是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/

    10-13 06:28