Strange Crash Problem



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 11/08/2006 at 10:42, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   9.603 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    Hi all

    i try to make a copy paste system for polygons.
    And i'm having some stability problems.

    Here is the code of the "copy" part. Sorry, i couln't simplify it anymore so that it still crashes.

      
      
    #include "c4d.h"  
    #include "c4d_symbols.h"  
      
    struct Clipboard  
    {  
    ~Clipboard() { TakeObjects(NULL); }  
    AutoAlloc<AtomArray> array;  
    void TakeObjects( AtomArray* a );  
    };  
      
    void Clipboard::TakeObjects( AtomArray* a )  
    {  
    if( !array ) return;  
    // free all stored objects  
    array->FilterObjectChildren();  
    for( LONG i=0; i<array->GetCount(); ++i )  
    {  
        BaseObject* op = static_cast<BaseObject*>( array->GetIndex(i) );  
        BaseObject::Free( op );  
    }   
    array->Flush();  
    GeAssert( array->GetCount()==0 );  
    // copy pointers from a to array  
    if( a ) a->CopyTo( array );  
    }  
      
      
    static Clipboard *g_clip = NULL;  
      
      
    void FreeClipboard()   
    {  
    gDelete( g_clip );  
    }  
      
    Clipboard* GetClipboard()   
    {  
    if( !g_clip ) {  
        g_clip = gNew Clipboard;  
    }  
    return g_clip;  
    }  
      
      
      
    Bool DoCopy( BaseDocument* doc )  
    {  
    Clipboard* clip = GetClipboard();  
    if( !clip ) return TRUE;  
      
    AutoAlloc<AtomArray> active;  
    doc->GetActivePolygonObjects( *active, TRUE );  
    if( active->GetCount()>0 )  
    {  
        ModelingCommandData md;  
        md.op = NULL;  
        md.arr = active;  
        md.doc = doc;  
        md.result = NULL;  
        md.mode = 0;  
        md.flags = 0;  
        md.result = NULL;  
        SendModelingCommand( MCOMMAND_SPLIT, md );   
        clip->TakeObjects( md.result );  
    }  
    else clip->TakeObjects( NULL );  
    return TRUE;  
    }  
      
      
    class MenuTest : public CommandData  
    {  
         public:  
              virtual Bool Execute(BaseDocument *doc);  
    };  
      
    Bool MenuTest::Execute(BaseDocument *doc)  
    {  
    DoCopy( doc );  
         return TRUE;  
    }  
      
    Bool RegisterMenuTest(void)  
    {  
         // decide by name if the plugin shall be registered - just for user convenience  
         String name=GeLoadString(IDS_MENUTEST); if (!name.Content()) return TRUE;  
         // be sure to use a unique ID obtained from www.plugincafe.com  
         return RegisterCommandPlugin(1000956,name,0,"icon.tif","C++ SDK Menu Test Plugin",gNew MenuTest);  
    }  
      
      
    //In main.cpp:  
      
    void FreeClipboard();  
      
    void PluginEnd(void)  
    {  
    FreeClipboard();  
    }  
      
    

    This code can crash reproducable when you do the following:

    Create c4d_debug.txt file, so C4d runns in debug mode.
    Run C4d.
    Make a cube.
    Make Editable.
    Make a HNWeightTag ( use hn weight tool on some edges )
    Select some polys
    Call the plug
    Quite Cinema
    ...
    BOOM... wtf..

    it only crashes if you run in debug mode, and have the HN tag. I suspect some memory becomes corrupted somehow.

    Okay this crash happens when you quit. But i'm also having other crashes which are harder to reproduce.

    I have no idea what is going on. Help ??!!



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 11/08/2006 at 12:31, xxxxxxxx wrote:

    hmm... if i use this...

      
    void Clipboard::TakeObjects( AtomArray* a )  
    {  
    if( !array ) return;  
    array->FilterObjectChildren();  
    for( LONG i=0; i<array->GetCount(); ++i )  
    {  
        BaseObject* op = static_cast<BaseObject*>( array->GetIndex(i) );  
        BaseObject::Free( op );  
    }   
    array->Flush();  
    GeAssert( array->GetCount()==0 );  
    if( a ) a->CopyTo( array );  
    for( LONG i=0; i<array->GetCount(); ++i )  
    {  
        BaseObject* op = static_cast<BaseObject*>( array->GetIndex(i) );  
        BaseTag *t;  
        while( t = op->GetTag( Tsds ) )  
        {  
          t->Remove();  
          BaseTag::Free( t );  
        }  
    }  
    }  
    

    ... the entire plug appears to work just fine.

    best regards
    Michael



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 17/08/2006 at 23:59, xxxxxxxx wrote:

    bump

    uhm.. mikael, can you reproduce ?



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 18/08/2006 at 14:05, xxxxxxxx wrote:

    Sorry, I thought that the last piece of code you posted was a fix. Perhaps I should take the time to actually read this thread through now... :-)



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 19/08/2006 at 10:21, xxxxxxxx wrote:

    Yes please check it out. The code is no fix, it removes the HNWeight-Tags which seem to cause the problems. It should work with all kind of tags though.

    Thanks



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 28/08/2006 at 01:31, xxxxxxxx wrote:

    You should use:

    C4DPL_ENDACTIVITY

    in PluginMessage otherwise (from the sdk docs) :

    Sent to all plugins before any PluginEnd() has been called. This allows you to close dialogs, end threads, delete temporary/undo buffers etc. In PluginEnd() it might crash as some resources from other plugins might already be freed.

    HTH.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 28/08/2006 at 02:53, xxxxxxxx wrote:

    Thanks David.


Log in to reply