我是Qt的新手,我想使用QSharedMemory作为工具在运行时连接一些应用程序。 我已经检查了QSharedMemory示例并提取了我需要使用它的所有内容。
这里的问题是QSharedMemory实例无法分配内存。
当我呼叫create()
时,它返回false,
当我打印存储在errorString()
中的错误消息时,它会显示以下错误:
QSharedMemory::create: unable to make key
我的代码与此类似:
QSharedMemory sharedmemory;
if(sharedmemory.isAttached())
sharedmemory.detach();
QString st = "this is the shared data";
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << st;
int size = buffer.size();
if(!sharedmemory.create(size))
{
std::cout<<sharedmemory.errorString().toStdString()<<std::endl;
return 1;
}
无论我将size
作为create()
方法提供给它,它都不会分配内存。
任何想法都是适当的。 谢谢 马赫迪
答案 0 :(得分:1)
来自qsharedmemory_unix.cpp
的源代码:
// build file if needed
int built = createUnixKeyFile(nativeKey);
if (built == -1) {
errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::create"));
error = QSharedMemory::KeyError;
return false;
}
来自QSharedMemory
的Qt文档:
QSharedMemory::QSharedMemory ( const QString & key, QObject * parent = 0 )
使用给定父级构造共享内存对象,并将其键设置为key。由于其密钥已设置,因此可以调用其
create()
和attach()
函数。另请参阅
setKey()
,create()
和attach()
。
QSharedMemory::QSharedMemory ( QObject * parent = 0 )
此函数重载
QSharedMemory()
。使用给定父级构造共享内存对象。共享内存对象的密钥不是由构造函数设置的,因此共享内存对象没有附加的底层共享内存段。 在
setKey()
或create()
可以使用之前,必须使用attach()
设置密钥。另见
setKey()
。
(强调我的)
您基本上使用的是构造函数的第二种形式,而不是设置共享内存密钥。您应该为QSharedMemory
提供一个关键名称 - 请咨询shm_open以获取有关此密钥的信息。请注意,在Linux中,POSIX共享内存是作为/dev/shm
中的文件系统实现的,并且对密钥名称有一些限制 - 除了名称的开头之外,它不能包含正斜杠(/
)。这样就需要在/dev/shm
中创建目录,而shm_open()
和QSharedMemory::createUnixKeyFile()
都不太愿意这样做。