Thread: [pygccxml-development] Call policy for a function returning a map
Brought to you by:
mbaas,
roman_yakovenko
From: Vincent F. <vin...@gm...> - 2008-07-30 08:17:42
|
I'm getting segmentation fault errors trying to replace data in a map. I've have the following attribute in my class : std::map<int,property> properties ; I get this map from a getter function with the following signature: map<int,property> & dataBase::getProperties(void) { return properties; } Then the method is called from another class in the C++ code : map<int,property> &target=DB.getProperties(); And I try to change data in it : target[tmpProperty.id]=tmpProperty; I get the segmentation fault at this line. The compiled C++ code is completely working alone, I allready tested it. I can load a file using one of my functions from C++ directly without any problem, but when I try to use this same function from Python, I get this segfault. I think the problem comes from a bad call policy fro this getProperties() function, but I'm not really sure. I'm currently using the following one : function.call_policies = call_policies.return_value_policy(call_policies.reference_existing_object) Thanks in advance for any help! |
From: Roman Y. <rom...@gm...> - 2008-07-30 09:29:48
|
On Wed, Jul 30, 2008 at 11:17 AM, Vincent Ferries <vin...@gm...> wrote: > I'm getting segmentation fault errors trying to replace data in a map. > > I've have the following attribute in my class : > std::map<int,property> properties ; > > I get this map from a getter function with the following signature: > map<int,property> & dataBase::getProperties(void) { > return properties; > } > > Then the method is called from another class in the C++ code : > map<int,property> &target=DB.getProperties(); > > And I try to change data in it : > target[tmpProperty.id]=tmpProperty; > > I get the segmentation fault at this line. > The compiled C++ code is completely working alone, I allready tested it. > I can load a file using one of my functions from C++ directly without > any problem, but when I try to use this same function from Python, I > get this segfault. > > I think the problem comes from a bad call policy fro this > getProperties() function, but I'm not really sure. > I'm currently using the following one : > function.call_policies = > call_policies.return_value_policy(call_policies.reference_existing_object) http://www.boost.org/doc/libs/1_35_0/libs/python/doc/v2/return_internal_reference.html In this case return_internal_reference should be used -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |
From: Vincent F. <vin...@gm...> - 2008-07-30 15:00:28
|
Ok, thanks for your answear. With further investigations, I thing the cause of my problem comes from the non-call to the constructor when instanciating my class. Some variables are not initialized and then the program encounters problems to store datas in unreserved memory. (-> segmentations faults) I have the following constructor (I simpllify it a little) : dataBase::dataBase(void) : generic::dataBase() { try { // Just for debugging purpose cout << "Here we are in constructor!" << endl; properties.clear(); } catchAll("dataBase::dataBase(void)",""); } I didn't seem to go through it, the first log sentence was never printed. I've gone in the associated wrapper class and found this declaration for the constructor : struct dataBase_wrapper : postLib::nastran::dataBase, bp::wrapper< postLib::nastran::dataBase > { dataBase_wrapper( ) : postLib::nastran::dataBase( ) , bp::wrapper< postLib::nastran::dataBase >(){ // null constructor } It seems weird to me... According to me, the instanciation of the corresponding class in Python should instanciate the underneath class with its defined constructor... Is there a bug or am I missing something? Thanks again! 2008/7/30, Roman Yakovenko <rom...@gm...>: > On Wed, Jul 30, 2008 at 11:17 AM, Vincent Ferries > <vin...@gm...> wrote: >> I'm getting segmentation fault errors trying to replace data in a map. >> >> I've have the following attribute in my class : >> std::map<int,property> properties ; >> >> I get this map from a getter function with the following signature: >> map<int,property> & dataBase::getProperties(void) { >> return properties; >> } >> >> Then the method is called from another class in the C++ code : >> map<int,property> &target=DB.getProperties(); >> >> And I try to change data in it : >> target[tmpProperty.id]=tmpProperty; >> >> I get the segmentation fault at this line. >> The compiled C++ code is completely working alone, I allready tested it. >> I can load a file using one of my functions from C++ directly without >> any problem, but when I try to use this same function from Python, I >> get this segfault. >> >> I think the problem comes from a bad call policy fro this >> getProperties() function, but I'm not really sure. >> I'm currently using the following one : >> function.call_policies = >> call_policies.return_value_policy(call_policies.reference_existing_object) > > http://www.boost.org/doc/libs/1_35_0/libs/python/doc/v2/return_internal_reference.html > > In this case return_internal_reference should be used > > > > -- > Roman Yakovenko > C++ Python language binding > http://www.language-binding.net/ > |
From: Roman Y. <rom...@gm...> - 2008-07-30 17:28:14
|
On Wed, Jul 30, 2008 at 6:00 PM, Vincent Ferries <vin...@gm...> wrote: > Ok, thanks for your answear. > > With further investigations, I thing the cause of my problem comes > from the non-call to the constructor when instanciating my class. Some > variables are not initialized and then the program encounters problems > to store datas in unreserved memory. (-> segmentations faults) > > > I have the following constructor (I simpllify it a little) : > > dataBase::dataBase(void) : generic::dataBase() { > try { > // Just for debugging purpose > cout << "Here we are in constructor!" << endl; > properties.clear(); > } > catchAll("dataBase::dataBase(void)",""); > } > > > I didn't seem to go through it, the first log sentence was never printed. > I've gone in the associated wrapper class and found this declaration > for the constructor : > > struct dataBase_wrapper : postLib::nastran::dataBase, bp::wrapper< > postLib::nastran::dataBase > { > > dataBase_wrapper( ) > : postLib::nastran::dataBase( ) > , bp::wrapper< postLib::nastran::dataBase >(){ > // null constructor > > } > > It seems weird to me... > According to me, the instanciation of the corresponding class in > Python should instanciate the underneath class with its defined > constructor... > > Is there a bug or am I missing something? I need to see Python code -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |