Eu sou muito novo no Qt e estou pensando em algumas coisas básicas com gerenciamento de memória e a vida dos objetos. Quando preciso excluir e / ou destruir meus objetos? Algo disso é tratado automaticamente?
No exemplo abaixo, qual dos objetos que crio devo excluir? O que acontece com a variável de instância myOtherClass
quando myClass
é destruída? O que acontecerá se eu não excluir (ou destruir) meus objetos? Isso será um problema para a memória?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Como você pode ver, isso é algo fácil para iniciantes, mas onde posso aprender sobre isso de maneira fácil?
(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> Esta não é a razão pela qual é seguro. No Qt 4.7.4, os filhos do QObject são excluídos diretamente (viadelete
, consulte qobject.cpp, linha 1955). A razão pela qual é seguro excluir objetos filho primeiro é que um QObject diz a seu pai para esquecê-lo quando for excluído.ClassB
herda deQObject
eClassC
herda deClassB
, entãoClassC
só será destruído apropriadamente pelo relacionamento pai-filho do Qt seClassB
o destruidor de for virtual.Eu gostaria de estender a resposta de Debilski apontando que o conceito de propriedade é muito importante no Qt. Quando a classe A assume a propriedade da classe B, a classe B é excluída quando a classe A é excluída. Existem várias situações em que um objeto se torna o proprietário de outro, não apenas quando você cria um objeto e especifica seu pai.
Por exemplo:
Outro exemplo:
Portanto, verifique a documentação frequentemente, ela geralmente especifica se um método afetará a propriedade de um objeto.
Conforme afirmado por Debilski, essas regras se aplicam SOMENTE a objetos que derivam de QObject. Se sua classe não deriva de QObject, você terá que lidar com a destruição sozinho.
fonte
Pai (o objeto QObject ou sua classe derivada) tem uma lista de ponteiros para seus filhos (QObject / seus derivados). O pai excluirá todos os objetos de sua lista de filhos enquanto o pai é destruído. Você pode usar esta propriedade de QObject para fazer com que objetos filhos sejam excluídos automaticamente sempre que o pai for excluído. A relação pode ser estabelecida usando o seguinte código
Há outra maneira de gerenciar memória no Qt, usando o smartpointer. O artigo a seguir descreve vários ponteiros inteligentes no Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
fonte
Para adicionar a essas respostas, para verificação, eu recomendo que você utilize a
Visual Leak Detetor
biblioteca para seus projetos Visual c ++, incluindo projetos Qt, já que é baseada em c ++, esta biblioteca é compatível comnew, delete, free and malloc
instruções, é bem documentada e fácil de usar. Não se esqueça de que, ao criar sua própria classe de interfaceQDialog
ouQWidget
herdada e, em seguida, criar um novo objeto dessa classe, não se esqueça de executar asetAttribute(Qt::WA_DeleteOnClose)
função de seu objeto.fonte