생성자(전연변수생성때)에서 cout을 하니 문제가....--?

hshthsh의 이미지

안녕하세요.

간단한 질문이지만 찾아보아도 초보인 제게 딱 떨어지는 답이 없어서
질문을 올리게 되었습니다.

g_ck 라는 클래스를 CValue.h에 선언하고, CValue.cpp에 정의하였는데요
프로그램 시작 했을 때 g_ck클래스네에서 아주 커다란 메모리를 정적 변수에
할당하고 프로그램 종료시 이 메모리를 해제하려고
CValue.cpp에 g_ck 클래스 객체를 전역변수로 선언했습니다.
그럼 이 전역변수가 생성될 때 와 소멸될 때 가장 처음과 마지막이 될거라
생각하고효..--a

그런데 생성자와 소멸자에 텍스트파일로 로그를 찍어보니 잘 되는것 같은데
생성자에서 cout으로 로그를 출력 하면 프로그램이 에러가 나면서 튕겨져 나오걸랑요. 그리고 소멸자에서 cout은 에러는 안나지만 출력이 안됩니다.

그래서 전역변수를 없에고 오직 main함수내에서만 g_ck객체를 만드니
그런 에러는 없었숩니다.
혹시 CValue.cpp에 선언한 전역변수가 생성시점이 문제인가효--a
cout객체를 사용할 수 없을 때 생긴다든지....

아시는 분 간단한 조언이라도 해주셨으면 너무 감사하겠습니다.....

vuccell의 이미지

전역변수를 왜 프로그램 끝날때 해제하나요?

변수의 할당과 해제는 같은 레벨에서 하는것이 좋을것 같은 생각이 듭니다.
그러니까.. 전역변수에서 선언한것은 포인터만 하고,
실제 할당을 프로그램 시작시 했다면, 끝날때 해제하는것이 맞지만, 그냥 전역으로 선언되어있는것이라면, 해제할 필요없지 않을까요?

hshthsh의 이미지

아 제가 다시 말씀드리겠숩니다... 대략 아래 코드와 같은데요.


[CValue.h] : g_ck클래스 선언

class g_ck
{
   static char **m_value;
   static int m_nObject;  //->g_ck클래스 객체 생성될 때마다 ++ 됩니다
..........
};

char **g_ck::m_value=NULL;
int g_ck::m_nObject=0;

[CValue.cpp] : g_ck클래스 정의

g_ck g_firstobject; //->최초의 g_ck클래스 객체생성되면서 m_value에할당

g_ck::g_ck()
{
  //가장처음 생성된 g_ck객체 g_firstobject생성시 m_value에 메모리할당
  if(m_nObject==0) 
  {
      m_value = new (*char[100]);
      cout<<"프로그램 시작 때 m_value에 메모리 할당";
  }
  m_nObject++;
}

g_ck::~g_ck()
{
//프로그램 종료시 g_firstobject 소멸되면서 m_value delete함
  m_nObject--;
  if(m_nObject==0)
  {
      delete [] m_value;
      cout<<"프로그램 종료 때 m_value 해제";
  }
}

대략 위와 같습니다. 일단 메모리 할당과 해제는 잘 되는것 같은데요..
그런데 생성자에서 cout을 하면 프로그램이 멈추고 밖으로 튕기더라고요--a
위에 cout출력 부분을 없에고 텍스트파일에 로그를 찍는 코드를 넣으면 그것은
잘 되거든요...
그래서 혹시 cout객체가 전역변수 생성 시점에 호출되는게 문제가 되는지
궁금해서 질문을 올리게 되었습니다.
혹시 이류를 아시면 약간의 조언이라도...^^a

doldori의 이미지

전역 개체의 생성 순서가 문제인 듯 합니다. g_firstobject는 분명히 main()이
시작하기 전에 생성이 완료되는 것은 맞습니다. 문제는 cout 역시 전역 개체라는
것이죠. 한 번역 단위 내에서 전역 개체의 생성 순서는 선언 순서와 일치합니다.
그러나 다른 번역 단위에서 정의된 개체라면 어떤 전역 개체가 먼저 생성되는지는
정해지지 않습니다. 따라서 g_firstobject가 먼저 생성될 경우 생성자 내에서
아직 생성되지 않은 cout을 사용하는 것은 잘못이겠죠. file stream으로 했을
때는 생성자 내에서 ofstream 개체를 먼저 만들고 출력하셨겠죠? 그러니 문제
없이 된 거고요.
이런 경우에 해결책은... 모르겠습니다. :( cout은 사용자가 건드려서는 안되는
개체라서 생성 시기를 제어할 방법을 못찾겠군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.