On Wed, Oct 12, 2011 at 3:25 PM, David Lonie <[email protected]> wrote:
> Hi list,
>
> I've written a routine that makes a copy of the UFF forcefield with
> MakeNewInstance() and caches it in a member variable of the my class.
> <snip>
> This works perfectly the first time it is used -- the forcefield is
> cloned and stored, and is used to successfully generate some
> conformers for my molecule. However, creating a new instance of
> MyClass and calling this function results in a segfault on the call to
> MakeNewInstance. The backtrace is rather unhelpful; the top two frames
> after the segfault show the MakeNewInstance line, and then a crash in
> libc.
I've attached a minimal working example to this email that shows this
behavior. Compile with
g++ -I/usr/include/openbabel-2.0 -lopenbabel obfftest.cpp -g
(change the include path as appropriate, of course)
It will segfault when run, crashing when bar's setupForceField method
is called, specifically in the MakeNewInstance line.
> On a hunch, I removed the lines that delete the m_ff object from
> MyClass's destructor. When I do this, my test script no longer crashes
> when run in the debugger. However, if I run it outside of gdb, it
> still segfaults. The only difference that I can imagine is that
> execution is slowed in the debugger, which makes me think there's some
> sort of race condition. However, my test script is not multithreaded.
Removing the "delete m_ff; m_ff = NULL;" bit from ~MyClass will let
the example run with no problems.
Let me know if any more information would help.
Dave
> Does anyone with intimate knowledge of OBForceField have any idea what
> could be happening? I'm using a recent build of trunk on linux.
>
> Dave
>
#include <openbabel/forcefield.h>
#include <openbabel/obconversion.h>
class MyClass
{
public:
MyClass() : m_ff(NULL) {}
~MyClass() {delete m_ff; m_ff = NULL;}
bool setupForceField();
protected:
OpenBabel::OBForceField *m_ff;
};
bool MyClass::setupForceField()
{
// already setup!
if (m_ff != NULL) {
return true;
}
// Initialize forcefield
// An OBConverison object must be instantiated before the
// FindForceField call will work.
OpenBabel::OBConversion conv;
OpenBabel::OBForceField *static_ff =
OpenBabel::OBForceField::FindForceField("UFF");
if (!static_ff) {
return false;
}
OpenBabel::OBForceField *ff = static_ff->MakeNewInstance();
if (!ff) {
return false;
}
m_ff = ff;
return true;
}
int main()
{
MyClass *foo, *bar;
foo = new MyClass();
foo->setupForceField();
delete foo;
foo = NULL;
bar = new MyClass();
bar->setupForceField();
delete bar;
bar = NULL;
return 0;
}
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2d-oct
_______________________________________________
OpenBabel-Devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbabel-devel