чтобы память автоматически освободилась. Это вообще возможно? Сейчас у меня есть тред в котором я выделяю память (из пула) и передаю указатель, а приемник потом память освобождает. Но я подумал, что наверное можно умные указатели применить и сделать более менее безопасную передачу (освобождение памяти).
Да, используй unique_ptr, выделяй в конструкторе (можно подсунуть параметром шаблона свой аллокатор), удаляй как захочешь через .release или само удалится в деструкторе. Делитер тоже можно свой подсунуть. Передавать владение, используя move-семантику.
auto *data = (char *) new(placement_buf) char (len + 1); memcpy(data, my_raw_data, len); data[len] = '\0'; // post message to the queue postMessage(task_id, T{data, len});
с авто-удалением ивента будут проблемы. или хендлеры придется выкручивать через одно место, или код будет не понятным. Предлегаю сделать так … FreertosQ <void*> q; typedef struct { int sig; } BaseEvt_t; typedef struct { BaseEvt_t super; std::string msg; } DervedEvt_t; … auto *ptr = malloc(sizeof(DervedEvt_t)); ptr.msg.assign(my_raw_data, len); q.post(ptr); …. while (1) { auto *evt = q.pend(); if (!p) continue; handle(p); delete p; } вообще жуткая смесь С/С++ получилась с утечкой памяти. но надеюсь идея понятна
так у меня примерно так и сделано. но смысл-то в том что ручной вызов delete, который можно забыть или пропустить (с ранним return)...
тогда надо свою очередь делать где объектом будет смарт поинтер, а не сырой указатель как у фриртос
Обсуждают сегодня