QT 가비지 콜렉터 질문 드립니다.
글쓴이: paeksj98 / 작성시간: 화, 2013/04/02 - 5:09오후
qt 가비지 콜렉터에 대해서 궁금한게 있어 질문 드립니다.
아래에 간단히 delete 가 필요 없음 있음 으로 해두었는데 맞는지좀 봐주세요...
qt 가비지 콜렉터에 관한 내용을 뒤져봐도 별로 내용을 찾을수가 없네요....
AA::AA( QWidget* parent, const char* name, WFlags fl ) : QWidget( parent, name, fl=Qt::WStyle_Customize) { bb = new bb(); ===> delete 필요 cc = new cc(this, "cc",false); ===> delete 필요없음. m_pErrorDialog = new Error(this, "m_pErrorDialog", false); ===> delete 필요없음. m_pPushButton = new QPushbutton(this); ===> delete 필요없음. } Error::Error( QWidget* parent, const char* name, WFlags fl ) : QWidget( parent, name, fl=Qt::WStyle_Customize) { m_Buff = new char[255]; =====> delete 필요 }
=====> 혹시 위부분에서 m_pErrorDialog = new Error(this, "m_pErrorDialog", false); delete가 필요 없으면 그 아랫단
m_buff도 혹시나 필요 없는건지..?? qt가 이렇게 영리하지 않을것 같기는 한데.... 요게 되면 아주 delete가 필요 없을것 같은데..ㅋㅋ
제 생각에 delete가 필요 한곳과 필요 없는걸루 구분해보았는제 맞는지좀 체크 부탁 드립니다.
Forums:
Qt에 가비지 컬렉터라는건 없습니다. QObject를
Qt에 가비지 컬렉터라는건 없습니다. QObject를 상속 받는 클래스의 객체들 사이에서만 부모 객체가 삭제될때 자식 객체도 삭제되도록 짜여져 있을 뿐입니다.
bb가뭔지, cc가 뭔지 알수가 없으므로 답변 불가능합니다.
m_pPushButton의 클래스인 QPushButton은 QObject를 상속 받으므로 부모 포인터로 넘긴 this가 삭제될때 같이 삭제 됩니다.
Error도 마찬가지입니다.
m_Buff는 delete[]로 지워야한다는 거만 주의하면 됩니다.
bb, cc는
bb::bb( )
{
;
}
cc::cc( QWidget* parent, const char* name, WFlags fl )
: QWidget( parent, name, fl=Qt::WStyle_Customize)
{
;
}
"QObject를 상속 받는 클래스의 객체들 사이에서만 부모 객체가 삭제될때 자식 객체도 삭제되도록 짜여져 있을 뿐입니다."
==> QObject 를 상속받은 AA가 부모객체이고
코드에서 delete AA(); 를 하게 되면 자식 객체인 cc,Error,QPushbutton이 자동 삭제되는 건가요..??
m_pPushButton의 클래스인 QPushButton은 QObject를 상속 받으므로 부모 포인터로 넘긴 this가 삭제될때 같이 삭제 됩니다.
Error도 마찬가지입니다.
==> this가 삭제될때 같이 삭제 된다는데 this가 어떤 시점에 자동 삭제 되는 간가요..??
object를 상속받은 클래스의 부모객체가 삭제될떄 자식 객체도 같이 삭제 된다는 말은 저한테는 어렵게 느껴지네요...
혹시 이부분에 대해 제대로 이해좀 하고 싶은데 제가 검색을 못해서 그런지 못찾겠네요. 혹시 아시는 사이트 있으시면 좀 알려주시면 감사하겠습니다.
"QObject를 상속 받는 클래스의 객체들
"QObject를 상속 받는 클래스의 객체들 사이에서만 부모 객체가 삭제될때 자식 객체도 삭제되도록 짜여져 있을 뿐입니다."
==> QObject 를 상속받은 AA가 부모객체이고
코드에서 delete AA(); 를 하게 되면 자식 객체인 cc,Error,QPushbutton이 자동 삭제되는 건가요..??
delete AA() 라는건 없습니다. AA의 객체를 delete한다는 걸 잘못쓰신거라면 맞습니다.
m_pPushButton의 클래스인 QPushButton은 QObject를 상속 받으므로 부모 포인터로 넘긴 this가 삭제될때 같이 삭제 됩니다.
Error도 마찬가지입니다.
==> this가 삭제될때 같이 삭제 된다는데 this가 어떤 시점에 자동 삭제 되는 간가요..??
this가 삭제되는게 언제인지는 짠 사람이 알겠죠. 자식 객체가 언제 삭제되느냐는 질문이라면, 부모객체의 QObject::~QObject()가 호출될때 그 안에서 삭제됩니다.
object를 상속받은 클래스의 부모객체가 삭제될떄 자식 객체도 같이 삭제 된다는 말은 저한테는 어렵게 느껴지네요...
혹시 이부분에 대해 제대로 이해좀 하고 싶은데 제가 검색을 못해서 그런지 못찾겠네요. 혹시 아시는 사이트 있으시면 좀 알려주시면 감사하겠습니다.
전혀 어려운 개념이 아닙니다. 아주 간단합니다. 대충 흉내내는 코드를 짜보면 다음과 같습니다.
이런 클래스에 대해서,
이렇게 하면 마지막 줄에서 parent->~Object() 가 호출되면서 child1과 child2도 같이 삭제됩니다.
Qt의 경우에는 여기에 더불어서 자식 객체가 먼저 삭제될 경우 부모의 자식 리스트(위에서는 m_children)에서 먼저 삭제된 자식 객체를 빼버리도록 짜여져 있어서 이중 삭제하는 문제를 방지합니다. 이것도 구현은 매우 간단합니다. 한번 생각해보세요.
정확한 답변 정말 감사 드립니다.
인터넷을 검색해도 이해가 안되었는데 답변해주신 내용으로 전부 이해가 됩습니다.
이런 구조로 되었군요.. 그동안 몰라서 전부다 delete를 해주었는데....
한가지 더 궁금한게 만약 자식객체를 delete해주면 자동으로 자식 객체를 빼준다고 하셨는데
그냥 delete만으로도 빠지나요 아니면 delete를 하고 거기에 NULL을 넣어줘야 하나요..
저는 지금까지 deltet를 하고 항상 NULL처리했습니다.
NULL확인으로 다시 할당하다던지 아니면 삭제등 기타 작업이 이루어 졌습니다..
AUTO delte 로 삭제가 되면 삭제된 객체에는 NULL로 채워지나요..??
정말 답변 감사합니다.
C++의 포인터도 값입니다. 포인터에 어떤 값이
C++의 포인터도 값입니다. 포인터에 어떤 값이 대입되는걸 다른 곳에서 '자동으로' 알 길이 없습니다.
당연히 '자식객체를 가리키는 포인터에 NULL이 대입되는 순간에 제거한다'같은건 불가능합니다.
삭제한 포인터에 널을 대입하는 것은 나중에 그 변수를 다시 쓸때 이 포인터를 할당해도 되나 안되나를 알아보기 위한 '약속'이지, 어떠한 프로그래밍언어적인 스펙이 아닙니다.
예를 들어 소멸자에서 삭제하는 포인터들에 대해서 특별한 이유가 없다면 일일이 소멸자에서도 널을 대입할 필요는 없겠지요.
감사합니다.
답변 주신것 정말 감사합다.
알려주신 것들은 전부 이해가 되네요.
앞으로 이거에 관해서는 해깔리지 않을것 같습니다....^^
댓글 달기