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:
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!
*** Potential Memory Leak Detected ***
The plugin is a GeDialog type plugin. But it uses external resource files instead of the built-in AddGizmo() style.
Bool result = TRUE;
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
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?
On 13/12/2011 at 11:37, xxxxxxxx wrote:
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.
On 13/12/2011 at 13:32, xxxxxxxx wrote:
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);
Unfortunately doing that also killed my CustomBitmapButton in the process.
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
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!
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.
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;
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,