【问题标题】:Why is passing a char* to this method failing?为什么将 char* 传递给此方法失败?
【发布时间】:2011-04-19 17:17:34
【问题描述】:

我有一个 C++ 方法,例如:

bool MyClass::Foo(char* charPointer)
{
   return CallExternalAPIFunction(charPointer);
}

现在我在其他地方有一些 static 方法,例如:

bool MyOtherClass::DoFoo(char* charPointer)
{
    return _myClassObject.Foo(charPointer);
}

我的问题是我的代码在那一点上中断了。它不会退出应用程序或任何东西,它永远不会返回任何值。为了尝试查明问题,我使用 Visual Studio 2010 调试器逐步检查了代码并发现了一些奇怪的地方。

当我进入DoFoo 函数并将鼠标悬停在charPointer 上时,我实际上看到了调用它的值(在本例中为IP 地址字符串)。但是,当我进入Foo 并将鼠标悬停在charPointer 上时,什么都没有显示,并且外部API 函数调用永远不会返回(就像它刚刚跨过一样)并且我的程序在调用DoFoo 后恢复执行。

我还尝试使用 VS 调试器的 Exception... 功能(以获取第一次机会异常),但它从未获取任何东西。

有人遇到过这种情况吗?我做错了吗?

谢谢。

【问题讨论】:

  • 您是使用调试还是发布设置进行构建?
  • 现在发布设置(刚刚编译了一个发布准备好的项目)我会尝试调试,看看我是否得到任何东西。
  • 您是否完全重建了应用程序?也许您正在针对您刚刚编辑的代码调试过时的二进制文件?
  • 这个char* 来自哪里?你确定它被正确分配了吗?

标签: c++ function pointers char


【解决方案1】:

您需要使用调试设置构建项目。发布设置意味着启用了优化,优化使调试变得困难重重。

如果没有优化,C++ 代码中的语句与程序中的机器代码块之间存在非常密切的对应关系。该程序较慢(通常慢得多),但更容易调试,因为您可以观察每个语句的作用。

优化器会重新排序您的代码、消除变量、内联函数、展开循环,并执行各种其他操作以加快程序运行速度。程序更快(通常更快),但调试起来要困难得多,因为您的 C++ 代码中的语句和机器代码中的指令之间的对应关系不再存在。

【讨论】:

  • 发布版本也会对参数和变量的鼠标悬停提示造成严重破坏。
  • 非常感谢您的回答,这可以解释为什么它只是无视我的电话。我现在在调试中构建了一些奇怪的 FileNotFoundException (C# 在这个项目中使用 CLI 与本机 C++ 混合)只是通过调用构造函数(不是在构造函数中,从构造函数调用)所以我会修复这个和你的建议可能会帮助我解决另一个问题。再次感谢。
  • 刚刚回来实际解释发生了什么。原来我正在调用的外部函数与我的方法命名相同,所以它改为调用我的方法,显然导致了 StackOverflow 异常。我不敢相信我没有看到这一点,但非常感谢您指出我应该处于调试状态。
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2021-09-07
  • 2022-01-17
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多