Привязка C / Python: модификация адреса указателя

Источник

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

Build (cmake)

набор (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 получает правильный адрес. Однако при использовании этого адреса позднее, он, кажется, был изменен.

2

Решение

Похоже, я дал недостаточный контекст для 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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]