首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >几次成功写入后出现Qt QSharedMemory分段故障

几次成功写入后出现Qt QSharedMemory分段故障
EN

Stack Overflow用户
提问于 2013-03-20 04:51:08
回答 1查看 794关注 0票数 1

我正在使用QSharedMemory存储一些数据,并希望随后将数据附加到其中包含的内容。因此,我使用新数据多次调用以下代码。"audioBuffer“是赋予此函数的新数据。在memcpy操作出现seg错误之前,我可以调用这个函数大约4-7次(可能会有所不同)。QSharedMemory位置的大小是巨大的,所以在我在seg出错之前所做的几个调用中,不存在memcpy复制超出其边界的数据的问题。此外,m_SharedAudioBuffer.errorString()不会给memcpy操作带来任何错误。目前,我只有一个进程在使用这个QSharedMemory段。我还试图连续写入,而不是每次都追加,这很好用,所以当我试图向共享内存段追加更多数据时,就会发生一些事情。有什么想法吗?谢谢!

代码语言:javascript
复制
    // Get the buffer size for the current audio buffer in shared memory
    int bufferAudioDataSizeBytes = readFromSharedAudioBufferSizeMemory(); // This in number of bytes

    // Create a bytearray with our data currently in the shared buffer
    char* bufferAudioData = readFromSharedAudioBufferMemory();
    QByteArray currentAudioStream = QByteArray::fromRawData(bufferAudioData,bufferAudioDataSizeBytes);
    QByteArray currentAudioStreamDeepCopy(currentAudioStream);

    currentAudioStreamDeepCopy.append(audioBuffer);
    dataSize = currentAudioStreamDeepCopy.size();

    //#if DEBUG
    qDebug() << "Inserting audio buffer, new size is: " << dataSize;
    //#endif

    writeToSharedAudioBufferSizeMemory( dataSize ); // Just the size of what we received

    // Write into the shared memory
    m_SharedAudioBuffer.lock();

    // Clear the buffer and define the copy locations
    memset(m_SharedAudioBuffer.data(), '\0', m_SharedAudioBuffer.size());
    char *to = (char*)m_SharedAudioBuffer.data();
    char *from = (char*)audioBuffer.data();

    // Now perform the actual copy operation to store the buffer
    memcpy( to, from, dataSize );

    // Release the lock
    m_SharedAudioBuffer.unlock();

编辑:也许,这是因为我的目标嵌入式设备非常小。当我试图写入共享内存时,可用的内存很大,但我注意到在/tmp目录(只有4Mb )中,我有以下条目-大小在/tmp中几乎没有消耗,所以我不确定为什么我不能分配更多的内存,而且QSharedMemory::create方法在我的最大大小为960000的情况下从未失败:

代码语言:javascript
复制
# cd /tmp/
# ls
QtSettings
lib
qipc_sharedmemory_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_sharedmemory_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qipc_systemsem_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_systemsem_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qtembedded-0
run
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 02:30:29

问题似乎是我在共享内存段返回的指针上使用了QByteArray的::fromRawData。当我在这个指针上显式地使用memcpy复制该数据,然后使用复制的数据构造我的QByteArray时,seg错误就停止了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15510184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档