QAudioOutput 代码是不是存在内存泄漏?

Posted

技术标签:

【中文标题】QAudioOutput 代码是不是存在内存泄漏?【英文标题】:Is there any memory leak with the QAudioOutput code?QAudioOutput 代码是否存在内存泄漏? 【发布时间】:2012-12-21 19:13:30 【问题描述】:

我正在像这样在 QThread 中播放音频流:

// Setup
QAudioFormat format;
format.setFrequency(44100);
format.setChannels(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
format = info.nearestFormat(format);
this->m_AudioOutput = new QAudioOutput(format, this);
DECLARE_ALIGNED(16,uint8_t,audio_buffer)[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

// Playback
QIODevice *iodevice = this->m_AudioOutput->start();
for(;;) 
    // Routine that fetches audio data from network
    // data_size is length of the buffer
    fetch_packet(&audio_buffer, data_size);

    qint64 dataRemaining = data_size;
    const char *b2 = (const char *)audio_buffer;
    while (dataRemaining) 
    qint64 bytesWritten = iodevice->write((const char *)b2, dataRemaining);
        dataRemaining -= bytesWritten;
        b2 = b2 + bytesWritten ;
    

    msleep(10);

音频播放正常,但应用程序的内存消耗似乎随着时间的推移而增加(大约每分钟 2MB)。我想知道我是否做错了什么。我想QAudioOutput应该负责在QIODevice的缓冲区被读取并用于播放后删除它?

【问题讨论】:

【参考方案1】:

我不这么认为,文档说:

开始播放音频流只需使用 QIODevice 调用 start()。 QAudioOutput 然后会从 io 设备获取它需要的数据。

它只是读取数据。 QIODevice 应该管理缓冲区。可以肯定的是,您可以使用 QIODevice::size() 检查缓冲区的大小,看看它是否在增长。

【讨论】:

好主意。 QIODevice::size() 确实没有增长。这可能意味着泄漏的不是QAudioOutput

以上是关于QAudioOutput 代码是不是存在内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

什么调试器可以检查 C++ 代码是不是存在内存泄漏? [复制]

使用 UIReferenceLibraryViewController 是不是存在内存泄漏?

将指针推回指针向量是不是存在内存泄漏?

内存泄漏检测

MicroPython hex 函数中是不是存在内存泄漏

如何确定我的 android 应用程序是不是存在内存泄漏?