2016-07-03 3 views
4

정적으로 할당 된 경우 Qt가 모든 QObject의 자식을 이중으로 삭제하지 않고 삭제할 수있는 방법을 이해할 수 없습니다. ,Qt가 스택에 할당 된 객체를 처리하는 방법

QWidget Window(nullptr); 
QPushButton button(&Window); 
Window.show(); 
return App.exec(); 
//When app ends, button then Window get deleted 
//because they were statically allocated 
//And then, Window (should) delete button AGAIN because it's its child, thus crashing 
//the program. But it doesn't. Why ? 

합니까 Qt는 내가 QPushButton을 만든 방법을 알고 :

QWidget Window(nullptr); 
QPushButton* button = new QPushButton(&Window); 
Window.show(); 
return App.exec(); 
//When app ends, Window gets deleted 
//because it was statically allocated 
//And then, Window deletes button because it's its child. 

그러나 나는 또한 충돌없이이 작업을 수행 할 수 있습니다 내가 그것을 일반적인 방법을 할 경우

기본적으로, 그것은 다음과 같습니다 또는 나는 무엇인가 놓쳤 느냐?

+0

예, 당신은, 즉 무언가를 그리워 정의되지 않은 동작은 정의입니다. –

+3

@ n.m .: 여기까지 정의되지 않은 것은 말할 수 없습니다. –

+1

@MattiVirkkunen 아마도이 예제에서는 정의되지 않은 것이 아무것도 없습니다. 충돌이 없다는 것은 아무 것도 증명하지 못한다는 것입니다. –

답변

8

QObject이 파괴되면 부모에게서 제거됩니다 (있는 경우). 따라서 Window이 (가) 파괴되면 QPushButton을 삭제하려고 시도하지 않습니다. 버튼이 더 이상 해당 창의 자식 목록에 없기 때문입니다.

아래 관련 문서. 또한 객체의 선언 순서가 부모/자식 관계 순서와 일치하지 않으면 실제로 객체가 두 번 파괴 될 수 있다는 사실을 언급합니다. 어느 것이 나쁜 것입니다.

http://doc.qt.io/qt-5/objecttrees.html

+0

알았어요. 그것은 창 앞에 단추를 만든 다음 button.setParent (& window)를 사용하면 실제로 충돌하는 것을 확인하는 것이 었습니다. 정말 ... 우아합니다 : D – bisthebis

+0

@bisthebis "우아함"은 제가 사용하는 단어가 아닙니다 ... RAII와 QObject의 육아 시스템을 혼합하는 것은 나쁘다. 또한 부모 - 자식 시스템은 똑똑히 스마트 포인터와 관련하여 나쁘게 작동한다는 점에 유의하십시오. 이는 현대 C++에서의 핵심 사안 중 하나입니다. – rubenvb

+0

@rubenvb : 음, 일관성이 좋지 않다는 것을 인정해야하지만, 모든 어린이를 unique_ptr에 두지 않아도된다는 것을 매우 기쁘게 생각합니다. 다른 측면에서, 임의의 비 Qt 객체를 내 윈도우 클래스의 멤버로 사용하는 경우 unique_ptr을 사용하거나 창 자식으로 선택하는 것이 어렵습니다. Qt가 당신에게 무엇을 제안하겠습니까? – bisthebis

관련 문제