【问题标题】:C++ - Having problems defining a variable inside main() functionC++ - 在 main() 函数中定义变量时遇到问题
【发布时间】: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 的指针保存在全局变量中的某个位置,该变量将在析构函数中访问它。

标签: c++ variables ogdf


【解决方案1】:

在我的机器上工作™。

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

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

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
  • 您有不同的“结构成员对齐”设置

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多