Я новичок в Qt и меня интересуют некоторые основные вещи, связанные с управлением памятью и жизнью объектов. Когда мне нужно удалить и / или уничтожить мои объекты? Выполняется ли что-либо из этого автоматически?
В приведенном ниже примере, какие из созданных мной объектов мне нужно удалить? Что происходит с переменной экземпляра myOtherClass
при myClass
уничтожении? Что произойдет, если я вообще не удалю (или не уничтожу) свои объекты? Будет ли это проблемой для памяти?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Как видите, это довольно легкая вещь для новичков, но где я могу легко об этом узнать?
(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> Это не причина, по которой это безопасно. В Qt 4.7.4 дочерниеdelete
элементы QObject удаляются напрямую (через , см. Qobject.cpp, строка 1955). Причина, по которой сначала безопасно удалять дочерние объекты, заключается в том, что QObject сообщает своему родительскому объекту забыть его при удалении.ClassB
наследуется отQObject
иClassC
наследует отClassB
, тоClassC
будет правильно уничтожен отношениями родитель-потомок Qt, только еслиClassB
деструктор является виртуальным.Я хотел бы расширить ответ Дебильски, указав, что концепция владения очень важна в Qt. Когда класс A принимает на себя владение классом B, класс B удаляется при удалении класса A. Есть несколько ситуаций, когда один объект становится владельцем другого, а не только тогда, когда вы создаете объект и указываете его родителя.
Например:
Другой пример:
Итак, часто проверяйте документацию, она обычно указывает, повлияет ли метод на владение объектом.
Как заявил Дебильски, эти правила применяются ТОЛЬКО к объектам, производным от QObject. Если ваш класс не является производным от QObject, вам придется справиться с разрушением самостоятельно.
источник
Родительский объект (объект QObject или его производный класс) имеет список указателей на его дочерние элементы (QObject / его производный). Родитель удалит все объекты в своем дочернем списке, в то время как родитель будет уничтожен. Вы можете использовать это свойство QObject для автоматического удаления дочерних объектов при удалении родительского объекта. Связь может быть установлена с помощью следующего кода
Есть и другой способ управления памятью в Qt с помощью smartpointer. В следующей статье описаны различные интеллектуальные указатели в Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
источник
Чтобы добавить к этим ответам, для проверки, я бы порекомендовал вам использовать
Visual Leak Detetor
библиотеку для ваших проектов Visual c ++, включая проекты Qt, поскольку она основана на c ++, эта библиотека совместима сnew, delete, free and malloc
операторами, она хорошо документирована и проста в использовании. Не забывайте, что когда вы создаете свой собственныйQDialog
илиQWidget
унаследованный класс интерфейса, а затем создаете новый объект этого класса, не забывайте выполнятьsetAttribute(Qt::WA_DeleteOnClose)
функцию вашего объекта.источник