2014-03-13 3 views
0

프로젝트에 OGDF C++ 라이브러리를 사용하려고하는데이 라이브러리 클래스의 보호 된 멤버 함수를 사용하려고합니다. 클래스 나 파생 클래스 외부의 보호 된 멤버에 직접 액세스 할 수 없으므로 Balloon Layout 클래스의 protected 메서드 사용 BallonLayout 클래스를 상속받은 클래스 A를 만들고 클래스 A의 public 함수 "abc()"에서 수퍼 클래스의 보호 된 함수를 호출합니다. 그래서 클래스 외부에서 abc()를 사용할 수 있고 BallonLayout 클래스의 함수를 간접적으로 보호 할 수 있습니다.보호 된 멤버 함수 액세스 중! 분할 오류 (코어 덤프 됨)

여기에 코드를 게시하면 문제가있는 부분을 알려주십시오.

#include <ogdf/basic/Graph.h> 
#include <ogdf/basic/graph_generators.h> 
#include <ogdf/misclayout/BalloonLayout.h> 

using namespace ogdf; 

class OGDF_EXPORT A : public BalloonLayout{ 
     public: 
      void abc(const Graph &G){ 
      selectRoot(G);     
      } 
}; 

int main() 
{ 
    int n = 5, m = 7; 
    Graph G; 
    ogdf::planarBiconnectedGraph(G, n, m); 

    A* a; 
    a->abc(G); 
    cout << "Done!!"; 
return 0; 
} 

오류없이 컴파일되지만 런타임에 "세그먼트 오류 (코어 덤프 됨)"가 표시됩니다. 이 오류는 메모리에없는 객체 (객체/변수)에 액세스하려고 할 때 발생합니다. 그러나 내가 한 실수는받지 못한다.

답변

0

귀하의 코드 :

A* a; 
a->abc(G); 

포인터 a를 초기화하지 않습니다. * 또는 -> 연산자를 사용하여 Null 또는 초기화되지 않은 포인터를 참조 해제하는 경우 은 정의되지 않은 동작입니다.

A a; 
a.abc(G); 

을 그리고 당신은, 동적으로 할당 된 메모리를 필요로하는 경우 <memory>을 포함 할 :

std::unique_ptr<A> a = new A(...); 
a->abc(G); 

을 사랑을 위해

방금 ​​사용, 모든 포인터를 필요로하지 않는, 알고 보니 생명, 우주 및 모든 것, 가능한 경우 알몸 포인터를 사용하지 마십시오.