issues with DLL and STL containers
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 20/05/2010 at 01:46, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R11
Platform: Windows ;
Language(s) : C++ ;---------
Hey everyone,my name is Heinrich Löwe, im working for Sehsucht GmbH in Hamburg. Me and a workmate(Martin Chatterjee) are working on a multi-platform-exchange format. For this reason we have written a DLL library which containes the basic functionality. It is imported in plugins for various applications and c4d is one of them.
I don't want to bore anyone with more details and will get straight to the point: The DLL is exporting functions which modify references to STL containers. If i use these functions in a C4D plugin, it always leads to crashes. However, they work fine with a direct inlcude of the code or in different environments than c4d.
I've boiled down the code to show you the main point:
Parts of the DLL library which are responsible for the problems:
// ... // define a dll import/export macro #ifdef DLL_TEST_EXPORTS #define DLL_MACRO __declspec(dllexport) #else #define DLL_MACRO __declspec(dllimport) #endif // ... // A representative structure exporting a stl container struct DLL_MACRO MyStruct { template class DLL_MACRO allocator<int>; template class DLL_MACRO vector<int, allocator<int> >; vector<int> vec; }; // ... // Global function which modifies the given reference void DLL_MACRO GlobalFunction(vector<MyStruct> &vec;) { // just do something with the input vec.resize(10); } // ...
Now the usage of the exported function in the C4D plugin code:
// ... // code is executed during the c4d startup phase, while // registering the plugin. Bool Register_MyTestPlugin(void) { // create some stl container, using the exported structure vector<MyStruct> *b = gNew vector<MyStruct>; // call exported function which modifies my stl container GlobalFunction(*b); // kill it, at this point the plugin crashes ///////////////////////////////////////////////////////// gDelete(b); ///////////////////////////////////////////////////////// // ... return TRUE; } // ...
While running that plugin in debug mode everything works, up to the point where the vector is deleted. I tracked it further down to a call to C4DOS.Ge->Free() in the overloaded delete operator in the file 'c4d_memory.cpp'.
Thas is the point where i got stuck and i'm hoping for your assistance to solve the problem,
Thanks,
Heinrich Löwe. -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 26/05/2010 at 06:19, xxxxxxxx wrote:
Which Cinema 4D version are you using? My test DLL with Cinema 4D R11.5 seems to work fine.
cheers,
Matthias -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 27/05/2010 at 01:16, xxxxxxxx wrote:
I'm using R11 64bit on a windows 7 machine.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 27/05/2010 at 03:04, xxxxxxxx wrote:
Ok, I can confirm the crashing on Cinema R11. Afaik it is due to the overloading of new/delete by the Cinema 4D SDK. Since R11.5 this is not the case anymore, making it easier to link to DLLs/DYLIBs. I am not sure if there is a solution for R11. I will forward the issue to the developers maybe they know a solution of the problem.
cheers,
Matthias -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 27/05/2010 at 05:14, xxxxxxxx wrote:
Strange now it crashes under R11.5 too. I'll have to ask the developers what is going on.
cheers,
Matthias -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/05/2010 at 09:53, xxxxxxxx wrote:
I upgraded to R11.5, and the test plugin (together with the test DLL) works fine now. But the real plugin still crashes with the following message:
Unbehandelte Ausnahme bei 0x000007fefd6caa7d in CINEMA 4D 64 Bit.exe: Microsoft C++-Ausnahme: std::bad_alloc an Speicherposition 0x02c25740..
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/05/2010 at 13:54, xxxxxxxx wrote:
try & catch? What about a little bit of source code that triggered the crash?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 29/05/2010 at 06:31, xxxxxxxx wrote:
Hello again,
i debugged the code this morning, made some changes and it seems to work fine. However, there is still one thing which leads to crashes: Whenever i pass a std::string to the dll, the plugin stops executing, but it does work fine when it's passed by reference.
This does not work:
// method declaration in the dll (parameter passed directly) bool openFile(string sFullPath); // ... // call it from the plugin std::string str("some filename in here"); if (reader.openFile(str)) { // ... } /* the plugin crashes when the method openFile() returns to the caller an the * local copy of the passed std::string is deleted. */
This works:
// method declaration in the dll (parameter passed by reference) bool openFile(string &sFullPath); // ... // call it from the plugin std::string str("some filename in here"); if (reader.openFile(str)) { // ... }
I 'solved' the problem by changing everything to 'call by reference' in the dll, but it doesn't feel good having some unexplainable error somewhere around.
Greetings,
Heinrich Löwe.