생성자(전연변수생성때)에서 cout을 하니 문제가....--?
글쓴이: hshthsh / 작성시간: 목, 2004/11/11 - 2:11오후
안녕하세요.
간단한 질문이지만 찾아보아도 초보인 제게 딱 떨어지는 답이 없어서
질문을 올리게 되었습니다.
g_ck 라는 클래스를 CValue.h에 선언하고, CValue.cpp에 정의하였는데요
프로그램 시작 했을 때 g_ck클래스네에서 아주 커다란 메모리를 정적 변수에
할당하고 프로그램 종료시 이 메모리를 해제하려고
CValue.cpp에 g_ck 클래스 객체를 전역변수로 선언했습니다.
그럼 이 전역변수가 생성될 때 와 소멸될 때 가장 처음과 마지막이 될거라
생각하고효..--a
그런데 생성자와 소멸자에 텍스트파일로 로그를 찍어보니 잘 되는것 같은데
생성자에서 cout으로 로그를 출력 하면 프로그램이 에러가 나면서 튕겨져 나오걸랑요. 그리고 소멸자에서 cout은 에러는 안나지만 출력이 안됩니다.
그래서 전역변수를 없에고 오직 main함수내에서만 g_ck객체를 만드니
그런 에러는 없었숩니다.
혹시 CValue.cpp에 선언한 전역변수가 생성시점이 문제인가효--a
cout객체를 사용할 수 없을 때 생긴다든지....
아시는 분 간단한 조언이라도 해주셨으면 너무 감사하겠습니다.....
Forums:
전역변수를 왜 프로그램 끝날때 해제하나요?변수의 할당과 해제는 같
전역변수를 왜 프로그램 끝날때 해제하나요?
변수의 할당과 해제는 같은 레벨에서 하는것이 좋을것 같은 생각이 듭니다.
그러니까.. 전역변수에서 선언한것은 포인터만 하고,
실제 할당을 프로그램 시작시 했다면, 끝날때 해제하는것이 맞지만, 그냥 전역으로 선언되어있는것이라면, 해제할 필요없지 않을까요?
아 제가 말을 조리있게 못해서==;; 다시 말씀드리면
아 제가 다시 말씀드리겠숩니다... 대략 아래 코드와 같은데요.
대략 위와 같습니다. 일단 메모리 할당과 해제는 잘 되는것 같은데요..
그런데 생성자에서 cout을 하면 프로그램이 멈추고 밖으로 튕기더라고요--a
위에 cout출력 부분을 없에고 텍스트파일에 로그를 찍는 코드를 넣으면 그것은
잘 되거든요...
그래서 혹시 cout객체가 전역변수 생성 시점에 호출되는게 문제가 되는지
궁금해서 질문을 올리게 되었습니다.
혹시 이류를 아시면 약간의 조언이라도...^^a
전역 개체의 생성 순서가 문제인 듯 합니다. g_firstobject는
전역 개체의 생성 순서가 문제인 듯 합니다. g_firstobject는 분명히 main()이
시작하기 전에 생성이 완료되는 것은 맞습니다. 문제는 cout 역시 전역 개체라는
것이죠. 한 번역 단위 내에서 전역 개체의 생성 순서는 선언 순서와 일치합니다.
그러나 다른 번역 단위에서 정의된 개체라면 어떤 전역 개체가 먼저 생성되는지는
정해지지 않습니다. 따라서 g_firstobject가 먼저 생성될 경우 생성자 내에서
아직 생성되지 않은 cout을 사용하는 것은 잘못이겠죠. file stream으로 했을
때는 생성자 내에서 ofstream 개체를 먼저 만들고 출력하셨겠죠? 그러니 문제
없이 된 거고요.
이런 경우에 해결책은... 모르겠습니다. :( cout은 사용자가 건드려서는 안되는
개체라서 생성 시기를 제어할 방법을 못찾겠군요.
댓글 달기