Memory Leak Problem
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/12/2011 at 08:59, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 12
Platform: Windows ;
Language(s) : C++ ;---------
While checking my plugin code for memory leaks. I discovered that using Init(GeGetPluginPath()) in my CreateLayout() function is not letting go of some memory.
Here is the message displayed by the c4d_debug.txt debugger:gui_newdialog.c<731>: 104 bytes at 19272928! 1 Blocks *** Potential Memory Leak Detected ***
The plugin is a GeDialog type plugin. But it uses external resource files instead of the built-in AddGizmo() style.
Code Snippet:
Bool myDialog::CreateLayout(void) { Bool result = TRUE; GeResource dlg_res; dlg_res.Init(GeGetPluginPath()); // <---This code creates a memory leak!! result = LoadDialogResource(IDS_RESDIALOG, &dlg_res, 0); //IDS_RESDIALOG is the items found in the .res file //GUI stuff here return TRUE; }
I'm new at memory management. And I've never seen init() cause a memory problem before.
How do I free this so it doesn't show up in the debugger as a leak?-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/12/2011 at 11:37, xxxxxxxx wrote:
Hi,
We need to allocate a custom resource only if we want to load resources from a custom resource path. We usually load resources from the res folder.
If you look at Main.cpp of the SDK examples, you'll see a line:if (!resource.Init()) return FALSE; // don't start plugin without resource
resource is a global GeResource allocated and freed by CINEMA 4D. It's declared at the end of the header file c4d_resource.h.
So your code should just be like the one used in the SDK examples.
And we don't need to pass GeGetPluginPath() to the Init() method because it's by default initialized with the plugin's main path. You can see the implementation of GeResource::Init(void) in c4d_resource.cpp. -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/12/2011 at 13:32, xxxxxxxx wrote:
Thanks Yannick.
Good explanation about how the resource.Init() function works.
Makes perfect sense.I fixed my loader code
Bool res = GeDialog::CreateLayout(); res = LoadDialogResource(IDS_RESDIALOG,NULL,0); return res;
Unfortunately doing that also killed my CustomBitmapButton in the process.
GroupBegin(0,BFH_LEFT,2,0,"MySecondGroup",0); { BaseContainer bbc; //Create a container to hold our custom button gizmo bbc.SetLong(BITMAPBUTTON_BORDER, BORDER_OUT); //Make the button style raised so it looks like a button bbc.SetBool(BITMAPBUTTON_BUTTON, TRUE); myButton = (BitmapButtonCustomGui* )AddCustomGui(10001,CUSTOMGUI_BITMAPBUTTON,"MY BUTTON", 0L,80,80,bbc); //Adds the BitmapButton GUI to the dialog //myButton->SetImage(Osphere, FALSE); //Adds the sphere icon to the button if that's what you want myButton->SetImage(200000000, FALSE); //Adds our custom registered icon using it's ID#...Be sure to get a real ID# from c4dcafe.com. DON'T use this one in your public projects! } GroupEnd();
Without GeGetPluginPath() in my loader code. The button no longer shows up.
Is there a way I can get this button to work again?
I can post the entire .cpp code if you need it.-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/12/2011 at 14:01, xxxxxxxx wrote:
Do you call resource.Init() ?
Your loader code should looks like this:if (!resource.Init()) return FALSE; // Call it at C4DPL_INIT_SYS plugin message // As done in the SDK examples if (!GeDialog::CreateLayout()) return FALSE; return LoadDialogResource(IDS_RESDIALOG,NULL,0);
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/12/2011 at 15:17, xxxxxxxx wrote:
I tried using that code but my button is still missing.
*Edit- Never mind Yannick. I found the problem
As usual. It was a really noobish mistake.
I put "return res" under my dialog loading code. Instead of at the end of the CreateLayout(void) method in place of "return TRUE".Like Kermit the frog says: "It's not easy being green:
Thanks for the help,
-ScottA