c++ 동적할당 및 해제 기초 질문좀 드릴게요

pogusm의 이미지

void MainWindow::test()
{
 
	QDialog *messageDialog = new QDialog(this);
	QVBoxLayout *vbox = new QVBoxLayout;
 
	QTextEdit *textEdit = new QTextEdit;
 
	QHBoxLayout *hbox1 = new QHBoxLayout;
	hbox1->addWidget(textEdit);
	vbox->addLayout(hbox1);
 
	QPushButton *okButton = new QPushButton(trUtf8("확인"));
	connect(okButton, SIGNAL(clicked()), messageDialog, SLOT(close()));
 
	QHBoxLayout *hbox2 = new QHBoxLayout;
	hbox2->addWidget(okButton);
	vbox->addLayout(hbox2);
 
	messageDialog->setLayout(vbox);
 
	messageDialog->show();
 
....
 
	int *j = (int *)calloc(10, sizeof(int));
	int *p = (int *)calloc(10, sizeof(int));
 
.....
 
	textEdit->append("AAAAAAAAAAA");
 
....
 
	free(p);
	free(j);
 
//	delete hbox2;
//	delete okButton;
//	delete hbox1 ;
//	delete textEdit;
//	delete vbox;
//	delete messageDialog;
 
}

위 소스코드는 Qt 프로그래밍에서 mainwindow.cpp 에 있는 일부 코드입니다.

다이얼로그 창을 만들고, 그 창안에 텍스트에디트창를 추가하여 그곳에 메시지등을 출력하는 기능을 합니다.

그런데 j, p 는 사용이 끝난후 free 로 해제를 해주면 되는거 같은데...
그외에 messageDialog 등은 delete를 해주면, 실제로 실행을 해보면, 다이얼로그 창 자체가 사라져버립니다.

이럴때, messageDialog 등은 원래 해제를 해주지 않아도 되는건가요?
아니면 어디서 해제를 해줘야 하는건가요?

조언 부탁드려요~

shint의 이미지

new로 생성하였을 경우. 메모리에 남게되니. 해제해 주어야 합니다.

private slots:
    void fn_close();
 
connect(okButton, SIGNAL(clicked()), this, SLOT(fn_close()));
 
void MainWindow::fn_close()
{
    qDebug() << "ok";
    delete messageDialog;
    messageDialog = NULL;
}

이런식으로 종료버튼을 눌렀을 경우.
메인윈도우에 이벤트를 보내서 fn_close()를 호출하고.
생성된 messageDialog 모달리스를 제거 해주어야 합니다.

messageDialog 모달리스를 여러개 생성할 경우. queue등으로 관리해서 각각의 모달리스를 해제해주어야 하는데.
제가 쓴 코드처럼 하나의 멤버변수에 넣고 해제할 경우. 이전 생성한 모달리스는 해제되지 않을 수 있으니 주의해야 합니다.

아. 그리고. x 버튼을 눌러서 종료되는 이벤트'도 받아서 제거하는 루틴도 필요하겠네요.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

pogusm의 이미지

확인버튼을 누르거나, close 될때 함수를 별도로 만들어서 해제를 해주어야 하는건가보네요.

생각외로 귀찮은거 같아요.. ㅠㅠ 할당/해제라는거...

messageDialog 을 전역으로 선언하고... 재사용하는 방식으로 하던지..
아니면 일일히 해제용 함수를 만들어 줘야겠습니다. ㅠㅠㅠ

답변 감사합니다~

gilgil의 이미지

void MainWindow::test()
{
  QDialog *messageDialog = new QDialog(this);
  ...
}

이 경우 messageDialog 의 parent는 MainWindow가 됩니다. parent(MainWindow)가 delete되는 경우 parent는 알아서 자기 자식들을 해제(delete)시켜 주기 때문에 code상으로 messageDialog 를 명시적으로 해제(delete)시켜 줄 필요는 없습니다.

  QDialog *messageDialog = new QDialog(NULL);

과 같이 parent를 명시하지 않았을 경우 명시적으로 messageDialog를 해제시켜 줘야 합니다.

이러한 성질은 GUI와 관련된 대부분의 framework에서 사용하는 방식입니다(MFC, VCL, QT, ...).

pogusm의 이미지

(this)로 parent를 명시해는것과 (NULL)로 하는것에 그런 차이가 있군요.

하지만 저의 상황에서는
MainWindow가 종료되기전에 test()가 여러번 반복적으로 호출되기 때문에
(this)로 해놓고 그냥 놔둘수만은 없을거 같습니다.

하지만 제가 몰랐던 내용이라 큰 도움이 되었습니다.
감사합니다.

라스코니의 이미지

다이얼로그를 뛰우기 위해서는

xxx->show(); 를 할수도 있고

xxx->exec(); 를 할수도 있습니다.

첫째는 그냥 디스플레이를 뛰우는 것이고
아래는 event loop로 들어가게 됩니다.

show()를 호출하면 다이얼로그가 화면에 나타난 후 바로 아래로 떨어집니다. 그래서 맨 아래 delete 가 호출되면서 대화창이 닫히는 겁니다.

exec()를 호출하면 다이얼로그가 화면에 나타난 후 event loop에 들어갑니다. OK, CLOSE 등을 누르지 않으면 아래로 실행이 넘어가지 않죠.

pogusm의 이미지

다이얼로그를 띄운후, textedit 에 실시간으로 결과를 출력해야해서

xxx->exec(); 를 사용하는건 저의 현재 상황엔 적합하지 않은거 같습니다.

하지만, 덕분에 xxx->exec(); 로 다이얼로그창를 띄울때는 하단에 delete를 해주면 된다는걸 알게 되었습니다.

감사합니다.

댓글 달기

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