C ++
extern "C"{
Service* create_service( int port )
{
Settings settings;
settings.set_port( port );
auto service = new Service( settings );
std::cout << "create_service returning pointer address: " << service << std::endl;
return service;
}
void release_service( Service* service )
{
std::cout << "release_service consuming pointer address: " << service << std::endl;
delete service;
}
}
питон
from ctypes import *
library = cdll.LoadLibrary('distribution/library/libhelpers.dylib')
class Service(object):
def __init__(self, port):
self.obj = library.create_service(port)
print "__init__ address: ", self.obj
def __del__(self):
print "__del__", self.obj
library.release_service(self.obj);
create_service возвращающий адрес указателя: 0x7fc3a0e330e0
в этом адрес: -1595723552
дель адрес: -1595723552
адрес указателя потребителя release_service: 0xffffffffa0e330e0
Ошибка сегментации: 11
Тип исключения: EXC_BAD_ACCESS (SIGSEGV)
Коды исключений: KERN_INVALID_ADDRESS в 0xffffffff914d37a0
набор (CMAKE_CXX_COMPILER clang ++)
set (CMAKE_CXX_FLAGS «-stdlib = libc ++ -std = c ++ 11 -Wall -Wextra -Weffc ++ -pedantic»)
add_library (помощники SHARED $ {MANIFEST})
target_link_libraries (помощники отдыхают)
При возврате экземпляра класса C ++ в качестве указателя. Python получает правильный адрес. Однако при использовании этого адреса позднее, он, кажется, был изменен.
Похоже, я дал недостаточный контекст для ctypes.
from ctypes import *
library = cdll.LoadLibrary('distribution/library/libhelpers.dylib')
class Service(object):
def __init__(self, port):
library.create_service.restype = c_void_p
self.obj = library.create_service(port)
def __del__(self):
library.release_service.argtypes = [c_void_p]
library.release_service(self.obj);
Других решений пока нет …