CDocData는 objectarx wizard로 프로젝트를 생성하면 자동으로 생성해주는 클래스입니다.
일반적으로 프로그래밍에서 Document에 연관된 데이터를 유지 관리하는데 사용합니다.
지금 진행중인 프로젝트에서 AutoCAD가 불규칙적으로 강제 종료가 되는 현상이 발견되고 있었습니다.(몇년전부터 쭉 진행중인 프로젝트라...)
도대체 아무리 코드를 뒤져봐도 그 원인을 파악할 수가 없었습니다.
이 프로젝트는 회사내부에서 사용하기 위해 진행중인 프로젝트라 이 문제를 눈감고 지나쳤습니다.
제가 만든 프로그램으로 사용자의 불만은 있었지만(프로그램이 불안정하다) 그럭저럭 2개의 프로젝트를 진행했습니다.
이 번에 다시 프로그램을 업데이트 할 일이 생겨서 지난번에 지나쳤던 문제를 해결하리라 마음먹고 이틀의 시간을 버그를 수정하는데 할애를 했습니다.
ADSN의 글을 읽는동안 CDocData는 map에서 관리하고 있는데 이것은 내부적으로 STL의 Tree형식으로 데이트를 관리합니다.
그래서 Tree의 밸런스를 맞추기 위해 데이터를 복사를 해서 Tree의 균형을 맞춘다고 합니다. 그러니 CDocData는 복사 생성자를 지원했어야 했습니다.
저의 CDocData 클래스는 복사 생성자도 지원하지 않고 소멸자에서 열심히 메모리 할당한 멤버 변수들을 열심히 메모리 해제를 하고 있었습니다.
그러니 어떻게 되겠습니까?
최종적으로 Tree에 생기는 CDocData의 포인터 멤버변수는 쓰레기 값을 가리키게 되고
이것을 가져다 쓰는곳에서는 필연적으로 에러가 발생될것입니다.
위의 원인은 제가 C++ 프로그래밍을 할때 기본적으로 지켜야할 원칙을 지키지 않았기 때문에 발생한 문제입니다.
클래스에는 기본적으로 복사 생성자를 만들어 줘야 합니다.
그렇게 하고 싶지 않으면 복사생성자를 protected나 private으로 정의해서 원칙적으로 클래스 복사가 되는것을 막아줘야 합니다.
일반적으로 프로그래밍에서 Document에 연관된 데이터를 유지 관리하는데 사용합니다.
지금 진행중인 프로젝트에서 AutoCAD가 불규칙적으로 강제 종료가 되는 현상이 발견되고 있었습니다.(몇년전부터 쭉 진행중인 프로젝트라...)
도대체 아무리 코드를 뒤져봐도 그 원인을 파악할 수가 없었습니다.
이 프로젝트는 회사내부에서 사용하기 위해 진행중인 프로젝트라 이 문제를 눈감고 지나쳤습니다.
제가 만든 프로그램으로 사용자의 불만은 있었지만(프로그램이 불안정하다) 그럭저럭 2개의 프로젝트를 진행했습니다.
이 번에 다시 프로그램을 업데이트 할 일이 생겨서 지난번에 지나쳤던 문제를 해결하리라 마음먹고 이틀의 시간을 버그를 수정하는데 할애를 했습니다.
ADSN의 글을 읽는동안 CDocData는 map에서 관리하고 있는데 이것은 내부적으로 STL의 Tree형식으로 데이트를 관리합니다.
그래서 Tree의 밸런스를 맞추기 위해 데이터를 복사를 해서 Tree의 균형을 맞춘다고 합니다. 그러니 CDocData는 복사 생성자를 지원했어야 했습니다.
저의 CDocData 클래스는 복사 생성자도 지원하지 않고 소멸자에서 열심히 메모리 할당한 멤버 변수들을 열심히 메모리 해제를 하고 있었습니다.
그러니 어떻게 되겠습니까?
최종적으로 Tree에 생기는 CDocData의 포인터 멤버변수는 쓰레기 값을 가리키게 되고
이것을 가져다 쓰는곳에서는 필연적으로 에러가 발생될것입니다.
위의 원인은 제가 C++ 프로그래밍을 할때 기본적으로 지켜야할 원칙을 지키지 않았기 때문에 발생한 문제입니다.
클래스에는 기본적으로 복사 생성자를 만들어 줘야 합니다.
그렇게 하고 싶지 않으면 복사생성자를 protected나 private으로 정의해서 원칙적으로 클래스 복사가 되는것을 막아줘야 합니다.
댓글
댓글 쓰기