我正在使用 QSharedMemory 存储一些数据,并希望随后将数据附加到其中包含的内容。所以我用新数据多次调用以下代码。“audioBuffer”是给这个函数的新数据。在 memcpy 操作出现故障之前,我可以调用这个函数大约 4-7 次(它会有所不同)。QSharedMemory 位置的大小很大,因此在我在段错误之前进行的几次调用中,没有 memcpy 复制数据超出其边界的问题。此外, m_SharedAudioBuffer.errorString() 不会对 memcpy 操作产生任何错误。目前,我只有一个使用这个 QSharedMemory 段的进程。我还尝试在不每次都追加的情况下连续写入并且效果很好,因此当我尝试将更多数据追加到共享内存段时发生了一些事情。有任何想法吗?谢谢!
// 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();
编辑:也许,这是由于我的目标嵌入式设备非常小。当我尝试写入共享内存时,可用 RAM 很大,但我注意到在 /tmp 目录(仅给出 4Mb )中我有以下条目 - 虽然 /tmp 中几乎没有消耗大小所以我'我不知道为什么我不能分配更多的内存,QSharedMemory::create 方法也不会因为我的最大大小 960000 失败:
# cd /tmp/
# ls
QtSettings
lib
qipc_sharedmemory_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_sharedmemory_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qipc_systemsem_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_systemsem_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qtembedded-0
run