Использование shared_ptr с очередью FreeRTOS

195
09 октября 2018, 15:10

Я использую контроллер ESP-32 и хочу передать std::shared_ptr, используя очередь FreeRTOS. Однако, при этом теряется один указатель. Вероятно, проблема кроется в этом куске кода:

{ // Начало функции
SoundControl ctrl;
…
ctrl.provider = sound; // +1 указатель (`sound` является константной ссылкой на std::shared_ptr)
…
xQueueSendToBack(queue, &ctrl, portMAX_DELAY); // ±0 указателей
} // Конец функции, -1 указатель

В результате стоящий в очереди указатель не считается, а его деструктор уменьшает счётчик ссылок на один.

Как можно решить эту проблему (продолжив использовать очереди FreeRTOS, если возможно)?

Answer 1

Судя по описанию xQueueSendToBack происходит простое копирование памяти объекта ctrl куда-то в очередь, причем счетчик на shared_ptr не увеличивается. Так делать с shared_ptr нельзя, что там происходит дальше я не знаю, но подозреваю что вы удаляете копию памяти на ctrl и отрабатывается деструктор shared_ptr, который уменьшает счетчик до нуля.

READ ALSO
У меня ошибка с HIBERNATOом: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

У меня ошибка с HIBERNATOом: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

Вот ссылка на англойязычную версиюНе могли бы Вы мне помочь, потому что советы на ссылочной версии не помогли: [https://stackoverflow

289
Как в sendkeys передать значение из файла properties?

Как в sendkeys передать значение из файла properties?

Подскажите пожалуйстаЕсть файл у меня settings

254
Кол-во точек в круге

Кол-во точек в круге

На вход принимается радиус(целое число)Нужно вычислить сколько точек входит в круг

185