c4d crashes when plugin is open

On 04/02/2014 at 11:33, xxxxxxxx wrote:

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

---------
I have created a command plugin which creates a dialog and some objects.
When I close cinema when the plugin is open, cinema crashes.
It is ok when I close the plugin before closing cinema 4d.

Could it be, because I allocate objects, but never "free" thems?
If so, where and what to free?

Or is main.cpp important? I almost commented out everything.
Note: The plugin works fine.

					BaseObject* sphere = BaseObject::Alloc(Osphere);
					sphere->SetName("Alloc test");
					doc->InsertObject(sphere, nullptr, nullptr);

On 04/02/2014 at 15:22, xxxxxxxx wrote:

In such a case, I comment out everything, then successively add function by function, line by line, until it chrashes again.

On 05/02/2014 at 01:49, xxxxxxxx wrote:

Wouldn't it be easier to step through with the debugger and see exactly where it crashes?

Steve

On 05/02/2014 at 03:12, xxxxxxxx wrote:

I do not think I can step through with the debugger, because when closing down cinema 4d, I get a crash message.
Strange enough I do not get it anymore.
I'll try to find out, what changed and took away the crash.

On 05/02/2014 at 03:22, xxxxxxxx wrote:

Once you insert the sphere into a document, it becomes the property of the document.  You do not need to free it yourself (unless you Remove() it from the document and take ownership).

I agree with ingvarai.  Comment all code and uncomment section by section until you hone in on the culprit.  The crash may be caused by something you never considered.

On 05/02/2014 at 04:18, xxxxxxxx wrote:

Aha.
It only crashes when the plugin is open and the timeline is on/running (Play Forward).
And indeed in the plugin I use frames to animated.
Thanks for all the input.

On 05/02/2014 at 04:29, xxxxxxxx wrote:

Perhaps some more information.
I have a command plugin and in MainDialog::Message I check current frame.
If not equal to previous, I animate some object positions.
I guess this is where it goes wrong.

Int32 MainDialog::Message(const BaseContainer& msg, BaseContainer& result)
{
	Bool animate, addSphere;
	GetBool(2033,animate);
	
	if (animate)
	{
		Int32 frame, fps;
		BaseDocument* doc = GetActiveDocument();
  
		fps = doc->GetFps();                               
		frame = doc->GetTime().GetFrame(fps); 
  
		//GePrint ("Message frame: " + String::IntToString(curframe));
        
		if (frame != currentFrame)
		{
			currentFrame = frame;
			....

On 05/02/2014 at 04:39, xxxxxxxx wrote:

After GetActiveDocument(), check:

if (!doc) return 0;

As C4D is closing, there may be no active document anymore.

On 05/02/2014 at 06:56, xxxxxxxx wrote:

Originally posted by xxxxxxxx

After GetActiveDocument(), check:

if (!doc) return 0;

As C4D is closing, there may be no active document anymore.

In fact, there is no document anymore, according to my experiences.
In any case, it is a criminal not to check an objects existence, before making it do something. I think we have the cause nailed down!

On 06/02/2014 at 00:37, xxxxxxxx wrote:

Ok, clear and thanks.
Again a lesson learned.

And indeed, that was the issue!