我已经设置了一个Kaa服务器并使用SDK开发了一个应用程序。但申请不发送活动按摩。 此应用程序应将停车的车牌发送到服务器,并将事件发送到另一个应用程序(接收器应用程序)。 应用程序将数据发送到服务器但不发送事件。
问题是什么?
这是我的代码:
static void callback(void *context)
{
kaa_string_t plate;
kaa_user_log_record_t *log_record = kaa_logging_data_collection_create();
plate.data = "some license plate";
log_record->plate = &plate;
kaa_logging_add_record(kaa_client_get_context(context)->log_collector, log_record, NULL);
printf("%s uploaded\n", plate.data);
kaa_plate_detection_event_plate_event_t *plate_event = kaa_plate_detection_event_plate_event_create();
plate_event->plate = &plate;
kaa_error_t error_code = kaa_event_manager_send_kaa_plate_detection_event_plate_event(
kaa_client_get_context(context)->event_manager, plate_event, NULL);
//plate_event->destroy(plate_event);
printf("%s event sent\n", plate.data);
}
答案 0 :(得分:1)
在callback()
的开头,您正在定义kaa_string_t plate;
==>
这意味着它的内存分配在堆栈中。
稍后在同一范围内,您将创建一个指向plate_event
的指针,它将用作您要发送的事件的参数。
在您发送活动之前,您需要分配plate_event->plate = &plate
。这意味着plate_event->plate
现在指向堆栈上的地址 。
然后,(根据您在评论中所写的内容),您使用异步函数发送事件。这意味着正在执行此函数的线程不等待消息真正发送 - 这是异步函数的含义。其他东西(可能是不同的线程,取决于send_event函数的实现)将负责发送。因此,在下一行代码执行之前发送消息并不保证。
在您的情况下,可能在发送邮件之前,callback()
的范围已经结束。因此,此范围的内存从现在开始自动释放并且无效,包括kaa_string_t plate
。然后在某些时候,异步发送正在执行,但它依赖于无效的内存,因为现在plate_event->plate
指向已经释放的内存。
不是在堆栈上分配kaa_string_t plate
,而是在堆上分配它(malloc
)。
类似的东西:
kaa_string_t *plate = malloc(sizeof(kaa_string_t));
strncpy(plate, "some license plate", sizeof(kaa_string_t));
...
// Now it's safe to do this:
plate_event->plate = plate;
// Sending event code
...