2013-09-05 8 views
6

ich Boost-Python verwende, ich generieren, ohne das Kopieren einer großen Vektor von ganzen Zahlen in C++, und ich möchte diesen Vektor in Python zugreifen.Zeiger übergeben von C++ auf Python/w boost python?

In C++ Ich habe:

BOOST_PYTHON_MODULE(myModule) 
{ 
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>()); 
    def("ReturnVectorPtr", ReturnVectorPtr, return_value_policy<manage_new_object>()); 
} 

vector<int>* ReturnVectorPtr() 
{ 
    return new vector<int>(); 
} 

Dann in Python Ich habe:

import myModule 
myModule.ReturnVectorPtr() 

Dieser Python zum Absturz bringt, obwohl ich nicht einmal den Rückgabewert zu speichern bin. Irgendwelche Ideen darüber, was mein Fehler ist?

Edit:

Der folgende Code für das Erhalten der Daten in dem Vektor von C++ zu Python funktioniert, aber verliert Speicher. Werden die Vektoren kopiert und dann nicht entsorgt?

In C++:

BOOST_PYTHON_MODULE(myModule) 
{ 
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>()); 
    def("ModifyVectorInPlace", ModifyVectorInPlace); 
} 

void ModifyVectorInPlace(vector<int>& data) 
{ 
    // Modify data... 
    return; 
} 

Dann in Python Ich habe:

import myModule 
vectorInt = myModule.vectorInt() 
myModule.ModifyVectorInPlace(vectorInt) 

Was ist los?

Edit 2:

Ich versuchte, das "Raw C++ Pointers" Beispiel von hier, genau wie geschrieben: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers

Er stürzt zu. Es scheint, dass ich nicht einen Zeiger auf etwas ging in Python aus irgendeinem Grunde ...

bearbeitet 3 erhalten kann:

Der Absturz erscheint ein segfault von invoke.hpp zu sein, in dieser Funktion:

template <class RC, class F BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class AC)> 
inline PyObject* invoke(invoke_tag_<false,false>, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac)) 
{ 
    return rc(f(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac,() BOOST_PP_INTERCEPT))); 
} 
+0

Der ursprüngliche Code funktioniert für mich. Es kann sich lohnen, Verifizieren, dass Boost.Python und 'myModule' gegen die gleiche Version von Python gebaut werden, und mit der gleichen Boost.Python Build-Konfiguration. Überprüfen Sie außerdem, ob "myModule" mit der Boost.Python-Version verknüpft ist, für die es erstellt wurde. –

+0

Ich denke, dass alles im Einklang Python-Bibliotheken verwendet. Ich habe mit Dependency Walker nachgesehen, aber vielleicht habe ich etwas verpasst. Ich verwende 64-Bit Python 2.7.5 und kompiliere mit Mingw-w64 unter Windows. Ich musste mit gendef und dlltool libpython27.a aus python27.dll erzeugen. Könnte das etwas damit zu tun haben? –

Antwort