[C++-sig] baffling memory leak with libboost 1.29.0

F. Oliver Gathmann gathmann at cenix-bioscience.com
Mon Aug 5 17:21:12 CEST 2002


I have a beginner's question concerning the return of smart pointers
to Python; please let me know if I am off-topic with this.

Consider the following code adapted from the "getting_started2.cpp"
sample in the boost distribution:

------------------------------------------------------------------------

#include <memory>
#include <iostream>
#include <string>
#include <boost/python/objects.hpp>
#include <boost/python/class_builder.hpp>


namespace example {

  class hello
  {
    public:
      hello(const std::string& country) { this->country = country; }
      std::string greet() const { return "Hello from " + country; }
    private:
      std::string country;
  };

  std::auto_ptr<hello> get_as_pointer(const std::string& country)
  {
    std::auto_ptr<hello> p(new hello(country));
    return p;
  }

  // forward declaration:
  PyObject * get_as_pyobject(const std::string& country);

}

namespace python = boost::python;
using namespace example;

BOOST_PYTHON_MODULE_INIT(boostexample)
{
    // Create an object representing this extension module.
    python::module_builder this_module("boostexample");

    // Create the Python type object for our extension class.
    python::class_builder<hello> hello_class(this_module, "hello");

    // Add the __init__ function.
    hello_class.def(python::constructor<std::string>());
    // Add a regular member function.
    hello_class.def(&hello::greet, "greet");

    this_module.def(get_as_pointer, "get_as_pointer");
    this_module.def(get_as_pyobject, "get_as_pyobject");

}

namespace example {

  PyObject * get_as_pyobject(const std::string& country)
  {
    std::auto_ptr<hello> p(new hello(country));
    return BOOST_PYTHON_CONVERSION::to_python(p);
  }

}

------------------------------------------------------------------------

Now, while both calls to get_as_pointer() and get_as_pyobject() will
return a "hello" instance as expected, get_as_pyobject() leaks memory
while get_as_pointer() doesn't. This is particularly surprizing as I
thought that if I return a smart pointer p directly (as this is done
in get_as_pointer()), the library just calls to_python(p) internally,
which is exactly what I am doing in get_as_pyobject(). Can anybody
explain to me what I am doing wrong here?

Any help is much appreciated,

Oliver

--------------------------
F. Oliver Gathmann, Ph.D.
Cenix BioScience GmbH
Pfotenhauer Strasse 108
D-01307 Dresden, Germany
phone: +49 (351) 210-2735
fax:   +49 (351) 210-1309
--------------------------






More information about the Cplusplus-sig mailing list