cout 이 실행되면 프로그램이 종료되는 문제

jackcha의 이미지

c++ 프로그램을 배우고 있습니다.
아래의 sample program 을 eclipse 에서 실행하면 문제가 없습니다.
동일한 프로그램을 cmd 창에서 g++ 로 compile 및 실행을 하면 cout 의 첫번째 output 이 출력되고 프로그램이 종료 됩니다. 왜 그런지 알고 싶습니다.
구글링을 통해 cout.flush(), endl 등을 사용해 보라는 내용을 적용해도 문제가 해소되지 않습니다.
조언을 부탁 드립니다.

프로그램 실행결과
-----------------------
Book title : Learn C++ Programming
<<1초정도 후에 프로그램 종료>>

-----------------------

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books book );
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main() {
   struct Books Book1;        // Declare Book1 of type Book
   struct Books Book2;        // Declare Book2 of type Book
 
   // book 1 specification
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan");
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;
 
   // book 2 specification
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // Print Book1 info
   printBook( Book1 );
 
   // Print Book2 info
   printBook( Book2 );
 
   return 0;
}
void printBook( struct Books book ) {
   cout << "Book title : " << book.title <<endl;
   cout << "Book author : " << book.author <<endl;
   cout << "Book subject : " << book.subject <<endl;
   cout << "Book id : " << book.book_id <<endl;
}
익명 사용자의 이미지

?!

https://ideone.com/V7KIB3

문제 원인이 코드보다는 환경에 있는 것 같아 보이는데, 구체적으로 어떤 환경에서 빌드 및 실행을 했는지 궁금하군요.

jackcha의 이미지

Windows 10 에 g++ (MinGW.org GCC-6.3.0-1) 6.3.0 환경입니다.
CMD 창에서 Compile 은 g++ "program name.cpp" 이렇게 하고 생성되는 a.exe 를 실행 했습니다.
cout 을 printf 문으로 바꾸면 이상없이 실행 됩니다.

라스코니의 이미지

환경이나 스택 관련한 이슈같은데 아래 처럼 해보세요.

void printBook( struct Books *book ) {
   cout << "Book title : " << book->title <<endl;
   cout << "Book author : " << book->author <<endl;
   cout << "Book subject : " << book->subject <<endl;
   cout << "Book id : " << book->book_id <<endl;
}

jackcha의 이미지

결과는 동일합니다. 한가지 "<< endl" 을 제거하니 정상 실행 됩니다. "<< endl" 이 부분이 왜 실행이 안되는지에 초점을 맞춰야 될것 같습니다. 다시 한번 검토 부탁 드립니다.

익명 사용자의 이미지

gcc 나 glibc 에 버그가 있나보죠. clang 으로 컴파일 해보세요.

익명 사용자의 이미지

clang, musl 이나, MS에서 제공하는 개발 툴이 있을 것 같은데 그걸 써보세요.
gcc (glibc) 는 성능이 좋지 않습니다. 그리고 버전이 6번대인데 옛날것 같으니 gcc 최신 버전으로 해보시던가요. MS에는 이미 훌륭한 개발 툴들이 있는데,, 굳이 gcc를 사용할 필요가... gcc 로 컴파일하면 glibc (libc)와 링킹되는 건 알고 계신지요.

Stephen Kyoungwon Kim@Google의 이미지

어떤 환경을 쓰시고 어떤 응용을 사용하느냐에 다르겠습니다만, gcc의 성능이 상대적으로 ICC, Studio Compiler, Clang 등에 비해 나쁘지는 않습니다. 보통 저런 급의 컴파일러들은 어떤 데서는 좋고 어떤 데서는 나쁘고 한 수준이에요. MS 컴파일러와 gcc 비교도 마찬가지일 겁니다.

훌륭한 개발 툴들이라는 게 소프트웨어 생산성과 연관된 거라면 그럴 수도 있는데 생산된 코드의 성능은 다른 얘기죠.

익명 사용자의 이미지

관리자분께서 댓글도 삭제하나보죠?
gcc 버전이 6번대이면 구버전이니 신버전으로 업뎃후에 해보시거나,
MS에도 개발툴들이 있으니 MS에서 제공하는 개발툴을 사용해보세요.
gcc 로 컴파일하면 glibc (libc)가 링킹됩니다. 그러니까.. gcc 버그인지 glibc 버그인지 알 수가 없으니, clang + musl 으로 컴파일해보시던가요. clang + musl 로 컴파일하려면 설정도 해야하고.
gcc 로 컴파일하면 glibc 링킹되는거 알고 계신지요. <=== 이거 때문에 댓글 삭제하신 건가요?

익명 사용자의 이미지

삭제됐다는 그 댓글에 무슨 내용이 있었는지 무척 궁금하군요

익명 사용자의 이미지

바로 위위에 있는 댓글인데요...
https://kldp.org/comment/634475#comment-634475
아까보니까 있네요. 파폭 버그인가봐요. 타 사이트에 댓글도 나왔다 안 나왔다 그러는거보니.
파폭에서 캐싱에 문제 있나보네요.
링크가 libstdc++ 요개 링크되네요. libc 가 아니라...제가 실수했네요. 죄송

익명 사용자의 이미지

크롬쓰니까 다 잘 되네요. 파폭 저번에 업뎃 후에 버그가 몇개 생긴거 같네요.
파폭 버그인줄도 모르고... 크롬쓰니까 문제 없이 잘 되네요.
그리고 위에 cpp 코드는 리눅스에서 돌려보니 잘 됩니다.

Stephen Kyoungwon Kim@Google의 이미지

제가 언어 표준을 꿰고 있는 게 아니라서 잘못 생각하는 것일 수도 있습니다. 얼핏 보기에 초기화 문제일 것 같네요.

   struct Books Book1;        // Declare Book1 of type Book
   struct Books Book2;        // Declare Book2 of type Book

이 부분을 아래처럼 해보세요.

   struct Books Book1 = {{0}, {0}, {0}, 0};        // Declare Book1 of type Book
   struct Books Book2 = {{0}, {0}, {0}, 0};        // Declare Book2 of type Book

익명 사용자의 이미지

뭐 다 아시겠지만, main() 함수 내에 strcpy 로 초기화 하는 코드가 있네요.
제가 볼 때는, 출력을 시키지만, 출력이 화면에 찍히기도 전에 종료되는게 문제인 것 같거든요.
즉, sync 로 동작하는 걸 바라는데, async 로 출력이 되면서 프로세스가 종료가 된 것은 아닌가...
이런 생각이 듭니다.
맨 마지막 줄에 sleep (1); 을 넣어보면 어떨까.. 그런 생각이 듭니다.

Stephen Kyoungwon Kim의 이미지

당연히 영향을 주면 안 되긴 하지만 혹시나 strcpy 뒤에도 남아 있는, 각 버퍼의 널 캐릭터 뒤에 있는 쓰레기값이 영향을 주는지 보고 싶어서요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.