fix: properly releasing C memory to avoid double-freeing

dev_1
Gordon 2 years ago committed by Gordon
parent c4f4d0422c
commit 314328c002
  1. 18
      c_wrapper/export.go
  2. 30
      c_wrapper/protocol.go
  3. 7
      c_wrapper/test.c

@ -294,40 +294,40 @@ func NewUserCallback(cCallback C.CB_I_S) *UserCallback {
type SendMessageCallback struct {
cCallback C.CB_S_I_S_S_I
operationID *C.char
operationID string
}
func NewSendMessageCallback(cCallback C.CB_S_I_S_S_I, operationID *C.char) *SendMessageCallback {
return &SendMessageCallback{cCallback: cCallback, operationID: operationID}
return &SendMessageCallback{cCallback: cCallback, operationID: C.GoString(operationID)}
}
func (s SendMessageCallback) OnError(errCode int32, errMsg string) {
C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS)
C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS)
}
func (s SendMessageCallback) OnSuccess(data string) {
C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS)
C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS)
}
func (s SendMessageCallback) OnProgress(progress int) {
C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress))
C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress))
}
type BaseCallback struct {
cCallback C.CB_S_I_S_S
operationID *C.char
operationID string
}
func NewBaseCallback(cCallback C.CB_S_I_S_S, operationID *C.char) *BaseCallback {
return &BaseCallback{cCallback: cCallback, operationID: operationID}
return &BaseCallback{cCallback: cCallback, operationID: C.GoString(operationID)}
}
func (b BaseCallback) OnError(errCode int32, errMsg string) {
C.Call_CB_S_I_S_S(b.cCallback, b.operationID, C.int(errCode), C.CString(errMsg), NO_DATA)
C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), C.int(errCode), C.CString(errMsg), NO_DATA)
}
func (b BaseCallback) OnSuccess(data string) {
C.Call_CB_S_I_S_S(b.cCallback, b.operationID, NO_ERR, NO_ERR_MSG, C.CString(data))
C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), NO_ERR, NO_ERR_MSG, C.CString(data))
}
// =====================================================global_callback===============================================

@ -10,19 +10,49 @@ typedef void (*CB_S_I_S_S_I)(char *,int,char *,char *,int);
void Call_CB_I_S(CB_I_S func,int event,char* data)
{
func(event,data);
if (data != NULL && data[0] != '\0')
{
printf("this is not null data event\n");
free(data);
}
}
void Call_CB_S_I_S_S(CB_S_I_S_S func,char* operationID, int errCode,char* errMsg,char* data)
{
func(operationID,errCode,errMsg,data);
if (errMsg != NULL && errMsg[0] != '\0')
{
printf("this is not null errmsg\n");
free(errMsg);
}
if (data != NULL && data[0] != '\0')
{
printf("this is not null data base,opid:%s,data:%s\n",operationID,data);
free(data);
}
if (operationID != NULL)
{
printf("this is not null operationID:%s\n",operationID);
free(operationID);
}
}
void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char* operationID,int errCode,char* errMsg,char* data,int progress)
{
func(operationID,errCode,errMsg,data,progress);
if (errMsg != NULL && errMsg[0] != '\0')
{
printf("this is not null errmsg\n");
free(errMsg);
}
if (data != NULL && data[0] != '\0')
{
printf("this is not null data\n");
free(data);
}
if (operationID != NULL)
{
printf("this is not null operationID\n");
free(operationID);
}
}
enum CONN_EVENT{
CONNECTING,

@ -46,10 +46,11 @@ int main(int argc, char **argv)
char* loginUserID=get_login_user();
printf("return :%s\n",loginUserID);
char* message = create_text_message(operationID,"哈哈");
char operationID1[] = "12345,create";
char *message = create_text_message(operationID1, "哈哈");
printf("return :%s\n",message);
get_all_conversation_list(c_base_callback,operationID);
char operationID2[] = "12345,get_all_conversation_list";
get_all_conversation_list(c_base_callback, operationID2);
sleep(1000000);
return 0;

Loading…
Cancel
Save