C ++ - 在main()函数中定义变量时遇到问题

时间:2014-03-05 10:00:58

标签: c++ variables ogdf

我正在尝试使用C ++,Visual Studio 2010中的外部库定义变量。它仅在我将其放在main函数之外时才有效。

此代码崩溃:

#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;
}

它给了我一个未经处理的例外:访问冲突。 但是,如果它在主要功能之外,它的工作没有任何问题:

#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;

}

调用堆栈:Call STack

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

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

1 个答案:

答案 0 :(得分: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
  • 您有不同的“结构成员对齐”设置