[C++-sig] Memory Leaks In VS.NET 2003 With BOOST_PYTHON_MODULE

mjkeyes at sbcglobal.net mjkeyes at sbcglobal.net
Fri Oct 14 06:35:19 CEST 2005


Okay, I solved the second problem.  Turns out it's something I wouldn't
expect.

Here's the situation - I have a C++ extended class to use in Python
called AccountMgr.  When I define a Python class, I do something like
this:

from MyModule import BaseClass #another extended class from C++
from MyModule import AccountMgr

class MyClass(BaseClass):
	def UseAccountMgr(self):
		self.acctMgr.DoSomething()

	acctMgr = AccountMgr()

Whenever this module is imported from another, it constructs the acctMgr
object (even if I haven't instanced MyClass yet).  However, this
destructor is never called (I'm guessing because Py_Finalize isn't
implemented?).

Two followup questions:
1.  How should I handle the construction of the acctMgr (or any other
extended member variable in a Python class)?  I tried supplying an
__init__(self) function, but I get some interpreter errors about
converting the C++ class to Python.  Consequently, for now, I do
something like this:

class MyClass(BaseClass):
	def UseAccountMgr(self):
		if self.acctMgr == None:
			self.acctMgr = AccountMgr()
		self.acctMgr.DoSomething()

	acctMgr = None

Can I declare the member variable as self.acctMgr = AccountMgr()?  I
haven't tried it.

2.  Please offer any comments on the Python code above.  I'm not green
when it comes to C++, but I've only been using Python for about a week,
so a little code review here would be helpful.

Thanks again!


"Matthew B. Keyes" <Keyes at simcrest.com> wrote in message
news:<6A26270516DF054BBB3B87AE01C831EC2CCBD0 at SERVER01.simcrest.int>...
> Sorry guys, it was late when I posted this, so the typo:
> 
> return object(new CreateClassA());
> 
> Meant to be:
> 
> return object(new A());
> 
> I was under the impression that the object class functioned as a 
> reference counting auto_ptr of sorts... That solves that one for me.
> 
> I'll post more later on the string issue 'cause I'm out of time right 
> now.  Thanks for the help!
> 
> "Ralf W. Grosse-Kunstleve" <rwgk at yahoo.com> wrote in message 
> news:<20051013155914.43599.qmail at web31505.mail.mud.yahoo.com>...
> > --- mjkeyes at sbcglobal.net wrote:
> > 
> > > Hey again, I'm back.
> > 
> > Hi Arnold! :)
> > 
> > > Here is some pseudo-code of what I'm doing:
> > 
> > Could you please turn this into a self-contained reproducer? Please
> explain
> > exactly how you compile and link. Note that you have to be very
> careful to not
> > mix debug and release builds under Windows.
> > 
> > > class A
> > > {
> > > public:
> > >   void SetString(const std::string &sVal)
> > >   {
> > >     m_sString = sVal; <--- Memory leak
> > 
> > I am doing things like this all the time and I am sure it doesn't 
> > leak
> for me.
> > 
> > >   }
> > > 
> > >   void DoStuff()
> > >   {
> > >     SetString(msc_sString);
> > >   }
> > > protected:
> > >   static const std::string msc_sString;
> > > }
> > 
> > Probably a side issue: do you really want "static" here?
> > 
> > > 
> > > class B
> > > {
> > > public:
> > >   object CreateClassA()
> > >   {
> > >     return object(new CreateClassA()); <---- memory leak
> > 
> > What is this? Does this even compile?
> > In any event, of course you get a memory leak if you use new like
> that.
> > Ideally, you don't have any "unencapsulated" new in your code. 
> > Always
> use
> > boost::shared_ptr<T>(new T) or std::auto_ptr<>(new T) or any other
> smart
> > pointer.
> > 
> > > Any suggestions?  I'm not getting any errors from the interpreter.
> > 
> > We need a complete reproducer.
> > 
> > Cheers,
> >         Ralf
> > 
> > 
> > 
> > 		
> > __________________________________
> > Yahoo! Music Unlimited 
> > Access over 1 million songs. Try it free.
> > http://music.yahoo.com/unlimited/




More information about the Cplusplus-sig mailing list