[C++-sig] virtual functions returning const char
Aaron Bentley
abentley at panoramicfeedback.com
Mon Jan 24 19:44:58 CET 2005
I've encountered a problem wrapping virtual functions that return const
char *. I get ReferenceError: Attempt to return dangling pointer to
object of type: c
Here's my example code (adapted from the tutorial):
struct Base
{
virtual const char * f(){return "fee";}
};
struct BaseWrap: Base
{
BaseWrap(PyObject* self_)
:
self(self_){}
const char *f() { return call_method<const char *>(self, "f"); }
const char *default_f() {return Base::f();}
PyObject *self;
};
const char *call_f(Base &b)
{
return b.f();
}
And then in the BOOST_PYTHON_MODULE
class_<Base, BaseWrap, boost::noncopyable>("Base")
.def("f", &Base::f, &BaseWrap::default_f)
;
def ("call_f", call_f);
Finally, in Python:
class Derived(Base):
def f(self):
return "foo"
d = Derived()
assert(d.f() == "foo")
assert(call_f(d) == "foo")
b = Base()
assert(b.f() == "fee")
assert(call_f(b) == "fee")
assert(Base().f() == "fee")
b = Base()
#all lines except this one pass
assert(call_f(b) == "fee")
All assertions except the last one pass. That is they pass
1. If I'm calling from Python or
2. If the default virtual function is not invoked.
But if I invoke the default virtual function from C++, I get the
dangling pointer exception.
I don't really understand the problem, since string literals like "fee"
should have a permanent location in memory.
Aaron
--
Aaron Bentley
Director of Technology
Panometrics, Inc.
More information about the Cplusplus-sig
mailing list