2013-08-02 4 views
3

У меня небольшая проблема с настраиваемым узлом, который я создал в Maya. Если я сделаю что-то вроде:Maya: Удаление узла не вызывает деструктор напрямую

createNode -n "MyInstance" "MyNode"; 
delete "MyInstance"; 

Это не называется деструктором класса. Но, если вы создаете новую сцену, открываете новый файл или делаете все, что заставляет уничтожать текущую сцену, деструктор, наконец, вызывается.

Дело в том, что у меня есть некоторые выделения памяти, которые я хотел бы сразу очистить, а не ждать, пока они не исчезнут. Потому что они больше не нужны, поэтому их нужно очистить.

Я просмотрел документацию, и я не вижу никаких виртуальных функций, которые я мог бы переопределить, которые будут вызываться, когда узел фактически удален или аналогичное событие. Существует такая функция, чтобы отслеживать связь между атрибутами (фактически используя ее в этом случае), но не удалять такую ​​вещь.

Итак, если у вас есть идея обхода, или способ имитировать это, пожалуйста, поделитесь!

Спасибо.

W

ответ

4

Так, ребята,

Наконец нашел. Это не так, как должно быть. У Autodesk есть какой-то странный способ сделать что-то.

Здесь:

void removeMyNode(MObject &node, void *clientData) 
{ 
    MFnDependencyNode nodeFn(node); 
    MGlobal::displayInfo(MString("Removal callback node: ") + nodeFn.name()); 
} 

MDGMessage::addNodeRemovedCallback(removeMyNode, "MyNode", NULL, &status); 

Таким образом, если узел будет удален, этот обратный вызов на самом деле называется. Тем не менее, я бы предпочел способ сделать это непосредственно в определении узла, переопределив функцию.

Спасибо всем, кто посмотрел на этот вопрос. Надеюсь, это может помочь некоторым из вас в конце концов!

+0

Достаточно ли это кода, или вам нужно вызвать конкретный деструктор в обратном вызове? –

+0

Если вы выделили что-либо в конструкторе или в любой другой точке для этого узла, вам нужно освободить его там. В частности, если внутренне ваши данные могут использоваться несколькими узлами. Немного похожий на общий указатель, убедитесь, что вы уменьшите счетчик и удалите, если необходимо. – widgg

+0

Хорошо, потому что моя проблема похожа на твою с немного иным эффектом. При удалении узла (MPxNode) с помощью ключа delete, Maya падает. Если я удалю его по коду (mdg.deleteNode), тогда он будет работать. Но прерывание nodeRemoveCallback кажется недостаточным. –