7

我正在尝试从 C++ 中的外部库 Visual Studio 2010 中定义一个变量。它仅在我将它放在主函数之外时才有效。

此代码崩溃:

#include "StdAfx.h"
#include <ogdf\basic\Graph.h>
#include <ogdf\basic\graph_generators.h>

int main()
{
   ogdf::Graph g;
   ogdf::randomSimpleGraph(g, 10, 20);
   return 0;
}

它给了我一个无法控制的异常:访问冲突。但是,如果它在 main 函数之外,它可以正常工作:

#include "StdAfx.h"
#include <ogdf\basic\Graph.h>
#include <ogdf\basic\graph_generators.h>

ogdf::Graph g;

int main()
{
   ogdf::randomSimpleGraph(g, 10, 20);
   return 0;
}

你有什么我该如何解决吗?我认为这是由某种链接问题引起的。

编辑:看起来问题不在于变量的初始化。当应用程序退出时,它会引发异常。

int main()
{
ogdf::Graph g; // No problem
ogdf::randomSimpleGraph(g, 10, 20); // No problem
int i; // No problem
std::cin>>i; // No problem
return 0;    // Throws an exception after read i;

}

调用堆栈:调用堆栈

输出为:graphs.exe 中 0x0126788f 处的第一次机会异常:0xC0000005:访问冲突写入位置 0x00000000。

graphs.exe 中 0x0126788f 处的未处理异常:0xC0000005:访问冲突写入位置 0x00000000。

4

1 回答 1

5

在我的机器上工作™。

像这样的深奥错误通常是二进制不兼容的结果。基本上,由于不同的编译器/预处理器选项,您的代码和库“看到”的有效标头是不同的。

例如,如果您有一个带有以下标头代码的库:

class Foo
{
#ifdef FOO_DEBUG
    int debug_variable;
#endif
    int variable;
};

库函数:

void bar(Foo& foo)
{
    std::cout << foo.variable;
}

和客户端代码:

Foo foo;
foo.variable = 666;
bar(foo);

如果FOO_DEBUG客户端和库之间不同步,这可能会崩溃和烧毁——variable会有不同的预期偏移量。

在您的情况下,我怀疑以下其中一项可能是真的:

  • 您使用与您的代码不同的编译器构建了 ogdf
  • 如果没有,您的 ogdf 和您的代码具有不同的构建配置(发布与调试)
  • 两者都是调试的,但你已经定义OGDF_DEBUG(如推荐的here
  • 您有不同的“结构成员对齐”设置
于 2014-03-05T11:04:25.687 回答