2
static void Job47(Args _args)
 {
 str                                  path,stx;
 TreeNodeIterator                     iter;
 TreeNode                             treeNode, treeNodeToRelease;
 Map                                  dictMenuDisplay;
 FormName                             formName;
 MenuItemName                         menuItemName;
 container                            conMenu;
 int                                  i,n;
   ;

 for (n=1;n<=100;n++)
       {
        info(strfmt("iter:%1",n));
        path            ="Menu Items\\Display";
        dictMenuDisplay = new Map(Types::String,Types::Container);
        treenode        = Treenode::findNode(path);
        iter            = treenode.AOTiterator();
        treenode        = iter.next();

        while (treenode)
          {
          formName     = treenode.AOTgetProperty("Object");
          menuItemName = treenode.AOTname();

           if (dictMenuDisplay.exists(formName))
            {
             conMenu = dictMenuDisplay.lookup(formName);
             conMenu = conIns(conMenu,conlen(conMenu)+1,menuItemName);
             dictMenuDisplay.insert(formName,conMenu);
             }

           else
             dictMenuDisplay.insert(formName,[menuItemName]);
                      //  treenode = iter.next();

           if(treeNodeToRelease && SysTreeNode::isApplObject(treeNode))
            {
             treeNodeToRelease.treeNodeRelease();
             treeNodeToRelease=null;
            }

           if(SysTreeNode::isApplObject(treeNode))
            {
              treeNodeToRelease=treeNode;
            }

            treeNode=iter.next();
        }
    }
  }

「内部実行スタックのオーバーフロー」というエラーが表示されます。コードは 86 回目の反復まで正しく実行されます。ヘルプ...

4

3 に答える 3

3

カーネルはすぐに TreeNode オブジェクトをガベージ コレクションしません。アプリケーション オブジェクトとそのすべての子のツリーノードが完成したら、 を呼び出してから、ガベージ コレクターをクリーンアップさせる必要がありTreeNode.treeNodeRelease()ますtreeNode=null;

...
TreeNode treeNodeToRelease;
...

while(treenode)
{

    ... /* do stuff with treenode */

    if(treeNodeToRelease && SysTreeNode::isApplObject(treeNode))
    {
        treeNodeToRelease.treeNodeRelease();
        treeNodeToRelease=null;
    }
    if(SysTreeNode::isApplObject(treeNode))
    {
        treeNodeToRelease=treeNode;
    }
    treeNode=iter.next();
}
于 2011-02-25T17:04:12.893 に答える
0

コード:

 if(treeNodeToRelease && SysTreeNode::isApplObject(treeNode))

次のものに置き換える必要があります。

 if (treeNodeToRelease)

オブジェクトのリリースは、次のオブジェクトに依存してはなりません。

または、これで十分かもしれません(Jayのソリューションに取って代わります):

while (treenode)
{
    ... /* do stuff with treenode */
    treeNode.treeNodeRelease();
    treeNode = iter.next();
}
于 2011-03-19T14:41:00.403 に答える