LINUX.ORG.RU

Жизнь объектов, созданных из C++

 , ,


0

1

Hi!

Опять на меня напал тупняк.

У меня есть несколько классов, которые я регистрирую как qmlRegisterType, потом описываю их в QML

Type1 { 
    prop1: ...
    prop2: ...
}
Но некоторые типы мне иногда нужно создавать динамически. поэтому я зарегал глобальную фабрику, которая отдает указатель на объект. В QML это выглядит как-то вот так
... {
    var t = componentConstructor.newType1( globalClient )
    t.doSomeWork( "some string as parameter" )
}

Но тут есть проблемка. При выходе из скопа t не уничтожается. То есть, вероятно, оно потом ее дропнет, когда отработает сборщик мусора, но, потыкав кнопку, я наплобил больше 5000 объектов, а сборщика так и не дождался. Можно, конечно, сделать t.destroy( ) но вот как бы сделать, чтоб объект при выходе из скопа сам умирал? есть тут аналог RAII какой-нить?

★★

Последнее исправление: ossa (всего исправлений: 1)

Вроде как вложенные объекты уничтожаются при уничтожении родительского. Кто у тебя родительский объект?

ziemin ★★
()
Ответ на: комментарий от ossa

В самом C++ нет никакого сборщика мусора. Что-то вроде сборщика есть в Qt и он работает именно так: родительский объект запоминает во внутреннем списке вложенные и уничтожает их в деструкторе.

А если ты ни к чему не привязываешься, то твоя функция всего лишь обёртка над new. И уничтожать объекты ты должен сам.

Вот: http://qt-project.org/doc/qt-4.8/qobject.html#dtor.QObject

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 1)
Ответ на: комментарий от ziemin

Ну про то, что в Qt объектам нужен родитель и что потом он всех своих детей дропает это я знаю. Но у меня нет родителя у объекта, зато есть скоп переменной t, а у t есть destroy( ), который есть у каждого объекта. Тут как бы больше не про С++ разговор, а про устройство QML (или может даже про JS?).

Тут ситуация то еще такая: из С++ я не могу узнать юзается ли созданный объект или нет. Может его из функции вернут. А вот QML это «знает»...или я так думаю, что должен знать.

ossa ★★
() автор топика
Ответ на: комментарий от dib2

о! кажется работает как надо. Спасибо!

ossa ★★
() автор топика

Если у тебя Type1 - это Qml компонент, и его можно создать из Qml, то можешь создавать его там динамически. Используй Qt.CreateComponent() и Component.createObject(). При createObject последним параметром указывается родитель.

Blastbit
()
Ответ на: комментарий от Blastbit

Если же хочешь создавать из плюсов фабрикой, то можешь так же передавать в функцию указатель на родителя: componentConstructor.newType1( globalClient, parent ) где parent имеет тип QObject* или QQmlItem*, передавать в конструктор, должно сработать. Если будет ругаться на типы, то можешь попробовать сделать типа parent QVariant и приводить к QObject* уже в плюсах.

Blastbit
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.