我正在使用 ESP-32 控制器并希望std::shared_ptr使用 FreeRTOS 队列进行流式传输。但是,丢失了一个指针。可能问题在于这段代码:
{ // Начало функции
SoundControl ctrl;
…
ctrl.provider = sound; // +1 указатель (`sound` является константной ссылкой на std::shared_ptr)
…
xQueueSendToBack(queue, &ctrl, portMAX_DELAY); // ±0 указателей
} // Конец функции, -1 указатель
结果,排队的指针不被计数,它的析构函数将引用计数器减一。
如何解决这个问题(如果可能,继续使用 FreeRTOS 队列)?
从xQueueSendToBack的描述来看,ctrl对象的内存只是简单的复制到队列的某处,shared_ptr上的计数器并没有增加。你不能用 shared_ptr 做这个,我不知道接下来会发生什么,但我怀疑你正在删除 ctrl 上的内存副本,并且正在处理 shared_ptr 析构函数,这会将计数器减少到零。