【发布时间】:2014-04-07 07:29:52
【问题描述】:
我正在尝试从 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。
【问题讨论】:
-
这可能与全局变量是零初始化的,而局部变量具有不确定的值有关。如果在本地声明时显式将
g初始化为零怎么办? -
@JoachimPileborg: 但 ogdf::Graph 是一个类,构造函数希望能完成初始化工作。文档是here
-
您也可以发布堆栈转储。引发异常的在哪里会很有趣,以及由于哪个地址。
-
析构函数有问题?
-
您可以尝试使用 new/delete 并验证 g 的析构函数是否抛出,或者是否它在链接库中的某个全局对象在程序退出时抛出。可能是库中的一个错误,其中指向 g 的指针保存在全局变量中的某个位置,该变量将在析构函数中访问它。