1

我是 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;
}

无论我对该方法给出什么sizecreate()它都不会分配内存。

任何想法都适用。谢谢马赫迪

4

1 回答 1

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;
}

来自 Qt 文档QSharedMemory

QSharedMemory::QSharedMemory ( const QString & key, QObject * parent = 0 )

使用给定的父对象构造一个共享内存对象,并将其键设置为键。因为设置了它的键,所以可以调用它的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()不太愿意这样做。

于 2012-08-08T17:13:17.890 回答