2 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以將 C 結(jié)構(gòu)體視為 SWIG 中的 C++ 類,并使用創(chuàng)建者和銷毀者方法擴(kuò)展它們。
在你的情況下你.i應(yīng)該有這個(gè)
typedef struct
{
uint8_t* const data;
const size_t maxSize;
size_t size;
} buffer_t;
%extend buffer_t {
buffer_t(size_t size)
{
buffer_t* pBuffer = malloc(sizeof *pBuffer);
pBuffer->data = malloc(size * sizeof (*pBuffer->data));
pBuffer->maxSize = size;
return pBuffer;
}
void ~buffer_t()
{
buffer_t *pBuffer = ($self);
free(pBuffer->data);
free(pBuffer);
return;
}
};
在Python中它將像這樣使用
from yourmodule import buffer_t
buffer = buffer_t(10)
垃圾收集器將負(fù)責(zé)釋放內(nèi)存。
還有其他方法可以做到這一點(diǎn),但您沒有重現(xiàn)示例來測試它。

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
我找到了一種解決方案,但由于指針類型轉(zhuǎn)換,它相當(dāng)黑客。我不相信這是執(zhí)行此操作的正確方法,但它有效:
在 .i 文件中,我使用 %inline 創(chuàng)建了一個(gè)包裝器:
%inline %{
buffer_t* new_buffer(size_t size)
{
buffer_t* pBuffer = (buffer_t*)malloc(sizeof(buffer_t));
*(uint8_t**)&pBuffer->data = (uint8_t*)malloc(size * sizeof(uint8_t));
*(size_t*)&pBuffer->maxSize = size;
return (buffer_t*)pBuffer;
}
void free_buffer(buffer_t* pBuffer)
{
free(pBuffer->data);
free(pBuffer);
return;
}
%}
添加回答
舉報(bào)