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

それは私に手に負えない例外を与えます:アクセス違反。ただし、メイン関数の外にある場合は、問題なく動作します。

#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推奨されているように)
  • 「Struct Member Alignment」設定が異なります
于 2014-03-05T11:04:25.687 に答える