2013-09-05 13 views
6

Boost Python kullanıyorum, C++ 'da büyük bir tamsayılar vektörü oluşturuyorum ve bu vektöre kopyalamaksızın Python'a erişmek istiyorum. Cİşaretçiyi C++'dan Python/w boost python'a geçirin mi?

++ ı vardır:

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>(); 
} 

Sonra python Ben: Ben bile dönüş değerinin saklanması değilim rağmen

import myModule 
myModule.ReturnVectorPtr() 

Bu, çökmesine Python neden olur. Hatamın ne olduğu hakkında bir fikrin var mı?

Düzenleme:

Aşağıdaki kod piton için C++ dan vektör verileri almak için çalışır, ancak bellek sızdırıyor

. Vektörler kopyalanıyor ve sonra imha edilmiyor mu? 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; 
} 

Sonra python Ben:

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

neler oluyor?

Düzenleme 2: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers

Çok çöküyor:

yazdım tam olarak buradan "Ham C++ İşaretçiler" örnek çalıştı.

kazasında Bu işlevde, invoke.hpp bir segfault gibi görünmektedir:

Düzenleme 3 ... Ben nedense Python geçirilen şey bir işaretçi alamayan görünüyor

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

ilk kod benim için çalışıyor. Boost.Python ve 'myModule'nın aynı Python sürümüne ve aynı Boost.Python yapı yapılandırmasına göre oluşturulduğunu doğrulamak yararlı olabilir. Ayrıca, "myModule" ın, karşı oluşturulduğu Boost.Python sürümüne karşı bağlantı kurduğunu doğrulayın. –

+0

Sanırım her şey tutarlı Python kitaplıkları kullanıyor. Bağımlılık Walker'ı kontrol ettim ama bir şeyleri kaçırmış olabilirim. 64-bit Python 2.7.5 kullanıyorum ve Windows'da Mingw-w64 ile derliyorum. Python27.dll dosyasından libpython27.a oluşturmak için gendef ve dlltool kullanmalıydım. Bununla bir ilgisi olabilir mi? –

cevap

İlgili konular