2010-03-03 3 views
5

미안하지만, Qt와 C++로 처음으로 작업 중이며 튜토리얼과 샘플을 통해 작업하고 있습니다.Qt에서 위젯 모음을위한 메모리 관리

언급 한 한 가지 점은 Qt 항목을 명시 적으로 삭제할 필요가 없다는 것입니다. 그래서, 메인 질문,이 또한 Qt 물건의 컬렉션에 적용됩니까? 마치 MyWidget의 동적 번호를 원한다고 말하면서 vector 또는 무엇이든 유지합니다. 그들은 아직도 나를 돌보고 있습니까?

사이드 질문으로, 소멸자에 대해 걱정할 필요가없는 것은 무엇입니까?

답변

5

Qt는 흥미로운 객체 모델을 가지고 있습니다. 처음 시작했을 때 new Foo 콜이 너무 많고 delete이 없다는 것이 불안했습니다.

http://qt.nokia.com/doc/4.6/object.html 개체 모델을 읽을 때 좋습니다. 관심의

것들 : QObject를 서브 클래스는 자신의 할당 및 복사 ctor에 방법을 사용할 수 있습니다. 개체 자식 부모 체인은 QObject에 의해 내부적으로 유지 관리됩니다. (당신이 자신을 그 포인터를 관리하는 계획이없는 경우) QObject를 서브 클래스를 인스턴스화 할 때

일반적으로 당신은 부모와 같은 다른 QObject를 포인터를 제공 할 것입니다. 이 '부모'는 방금 한 아이의 관리를 대신합니다. QObject에서 setParent()를 호출하여 누가 그것을 "소유"했는지 변경할 수 있습니다. Qt에는 객체의 부모를 변경하는 메소드가 거의없고, 모두 문서에서 명시 적으로 명시하고 있습니다.

귀하의 특정 질문에 대답하려면 : 귀하의 모든 MyWidget 인스턴스를 어떻게 만드는지에 따라 다릅니다.

부모와 함께 각각을 만든 경우 삭제할 필요가 없습니다. 부모는 삭제되면 삭제합니다.

당신은 그들의 QList<MyWidget*> 수집을 유지하는 경우, 당신은 당신이 그들에게 자신을 삭제해야합니다, 그들에게 부모를 포기하지 않았다.

7

Qt 메모리 관리 모델은 부모 - 자식 관계를 기반으로합니다. Qt 클래스는 생성자의 매개 변수로 선택 사항 인 parent을 사용합니다. 새 인스턴스는이 부모와 함께 등록되어 부모가 삭제 될 때 삭제됩니다. Qt 컬렉션 (예 : QList)을 사용중인 경우 목록을 해당 항목의 상위 항목으로 설정할 수 있다고 생각합니다. std :: vector 나 다른 콜렉션 유형을 사용한다면 "자동"메모리 관리를 얻지 못할 것이다.

Qt 모델은 UI 계층 구조와 일대일로 일치하는 UI 계층 구조에서 많은 의미가 있습니다. 다른 경우에는 항상 깔끔하게 매핑되는 것은 아니므로 Qt 시스템을 사용하여 특정 상황에 적합한 지 여부를 평가해야합니다. 일반적인 C++ 도구는 여전히 작동합니다. std :: tr1 :: shared_ptr 또는 다른 스마트 포인터 클래스를 사용하여 개체 수명을 관리하는 데 도움이됩니다. Qt는 또한 참조 포인터와 약한 참조 쌍을 구현하는 QPointer, 보호 된 포인터 및 QSharedPointer/QWeakPointer 쌍을 포함합니다.

+2

Qt 컬렉션을 개체의 부모로 설정할 수 없습니다. 동적으로 할당되고 부모 - 자식 관계를 갖는 객체는 QObject이며 QObjects/QWidgets 하위 클래스를 부모로 사용합니다. QList 및 다른 컬렉션 클래스는 QWidget (및 확장 QObject)을 상속하지 않으므로 부모로 설정할 수 없습니다. – blwy10