我是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()方法,它都不会分配内存。
任何想法都是有价值的。谢谢马赫迪
发布于 2012-08-09 01:13:18
来自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()。
构造一个具有给定父级的共享内存对象。共享内存对象的键不是由构造函数设置的,因此共享内存对象没有附加底层共享内存段。在使用create()或attach()之前,必须使用setKey()设置密钥。
另请参见setKey()。
(强调我的)
您基本上是在使用第二种形式的构造函数,而不是设置共享内存键。您应该为QSharedMemory提供一个密钥名称-有关此密钥可以是什么的信息,请咨询shm_open。请注意,在Linux POSIX中,共享内存是作为/dev/shm中的一个文件系统实现的,并且对键名有一定的限制-它不能在任何地方包含正斜杠(/),除非在名称的开头,因为有了正斜杠(/)就需要在/dev/shm中创建目录,而shm_open()和QSharedMemory::createUnixKeyFile()都不愿意这样做。
https://stackoverflow.com/questions/11825212
复制相似问题