2014-03-05 3 views
6

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

그것은 나에게 unhandheld 예외를 제공합니다. 이 밖에 주요 기능을 경우 그러나, 그것은 아무 문제없이 작동합니다

#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 위치를 기록하는 액세스 위반입니다.

+4

아마도 전역 변수는 0으로 초기화되는 반면, 지역 변수에는 불확정 값이있을 수 있습니다.국지적으로 선언 할 때'g'를 명시 적으로 제로 - 초기화하면 어떻게 될까요? –

+2

@ JoachimPileborg :하지만 ogdf :: Graph는 클래스이며 생성자가 초기화 작업을 수행합니다. 설명서는 [here]입니다 (http://www.ogdf.net/doc-ogdf/classogdf_1_1_graph.html) –

+1

또한 스택 덤프를 게시 할 수 있습니까? 흥미로운 부분은 ** 어디에서 ** 예외가 발생했는지, 그리고 어떤 주소 때문인지. – Flovdis

답변

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을 구축하고 코드가 다른 빌드 구성이 :

    귀하의 경우

    , I에 해당 할 수 있습니다 다음 중 하나를 의심 (디버그 대 릴리스)

  • 은 모두 디버그,하지만 당신은 설정
  • 을 (here를 권장) OGDF_DEBUG 당신은 다른 "구조체 회원 정렬"가 정의되어