我正在尝试从 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。
最佳答案
在我的机器上工作™。
像这样的深奥错误通常是二进制不兼容的结果。基本上,由于不同的编译器/预处理器选项,您的代码和库“看到”的有效 header 是不同的。
例如,如果您有一个包含以下 header 代码的库:
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
在客户端和库之间不同步,这可能会崩溃和燃烧——变量
将有不同的预期偏移量。
在您的情况下,我怀疑以下情况之一可能是正确的:
- 您使用与您的代码不同的编译器构建了 ogdf
- 如果不是,则您的 ogdf 和您的代码具有不同的构建配置(发布与调试)
- 两者都是调试的,但您已经定义了
OGDF_DEBUG
(推荐here) - 您有不同的“结构成员对齐”设置
关于C++ - 在 main() 函数中定义变量时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22194389/