本页内容

QSharedMemory Class

QSharedMemory 类用于访问共享内存段。更多内容...

头文件: #include <QSharedMemory>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QObject

公共类型

enum AccessMode { ReadOnly, ReadWrite }
enum SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, AlreadyExists, …, UnknownError }

公共函数

QSharedMemory(const QString &key, QObject *parent = nullptr)
QSharedMemory(QObject *parent = nullptr)
QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)
virtual ~QSharedMemory()
bool attach(QSharedMemory::AccessMode mode = ReadWrite)
const void *constData() const
bool create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
void *data()
const void *data() const
bool detach()
QSharedMemory::SharedMemoryError error() const
QString errorString() const
bool isAttached() const
QString key() const
bool lock()
(since 6.6) QNativeIpcKey nativeIpcKey() const
QString nativeKey() const
void setKey(const QString &key)
(since 6.6) void setNativeKey(const QNativeIpcKey &key)
void setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
qsizetype size() const
bool unlock()

详细说明

QSharedMemory 允许多个线程和进程访问共享内存段。共享内存段通过键进行标识,该键由QNativeIpcKey 表示。可通过 platformSafeKey() 以跨平台的方式创建键。

必须有一个 QSharedMemory 对象通过create() 创建该段,此调用会指定段的大小。所有其他进程只需对该段调用attach(),该段必须已存在。任一操作成功后,应用程序可调用data() 获取指向数据的指针。

为了支持非原子操作,QSharedMemory 提供了获取独占访问权限的 API:您可以在从共享内存中读取或向其写入数据之前,使用lock() 锁定共享内存,但请记住,操作完成后务必使用unlock() 释放锁。

默认情况下,当最后一个 QSharedMemory 实例从该段中detached ,且该段不再有任何引用时,QSharedMemory 会自动销毁该共享内存段。

有关密钥类型、平台特定限制以及与旧版或非 Qt 应用程序的互操作性的详细信息,请参阅《本机 IPC 密钥》文档。其中包含针对 Apple 平台上沙盒应用程序的重要信息,包括通过 Apple App Store 获取的所有应用程序。

另请参阅 《进程间通信》和《QSystemSemaphore 》。

成员类型文档

enum QSharedMemory::AccessMode

常数值描述
QSharedMemory::ReadOnly0该共享内存段为只读。不允许向该共享内存段写入数据。若尝试向使用 ReadOnly 创建的共享内存段写入数据,将导致程序终止。
QSharedMemory::ReadWrite1允许对共享内存段进行读写操作。

enum QSharedMemory::SharedMemoryError

常数值描述
QSharedMemory::NoError0未发生错误。
QSharedMemory::PermissionDenied1操作失败,因为调用者没有所需的权限。
QSharedMemory::InvalidSize2创建操作失败,因为请求的大小无效。
QSharedMemory::KeyError3操作因键值无效而失败。
QSharedMemory::AlreadyExists4create() 操作失败,因为已存在具有指定键的共享内存段。
QSharedMemory::NotFound5attach() 操作失败,因为找不到具有指定键的共享内存段。
QSharedMemory::LockError6lock() 操作失败,因为create() 或attach() 失败并返回 false,或者因为QSystemSemaphore::acquire() 中发生了系统错误。
QSharedMemory::OutOfResources7create() 操作失败,因为可用内存不足以满足请求。
QSharedMemory::UnknownError8发生了其他问题,且情况严重。

成员函数文档

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

创建一个共享内存对象,使用给定的parent ,并将legacy键设置为key 。由于其键已设置,因此可以调用其create()和attach()函数。

另请参阅 setKey()、create() 和attach()。

QSharedMemory::QSharedMemory(QObject *parent = nullptr)

使用给定的parent 构建一个共享内存对象。该共享内存对象的键由构造函数设定,因此该共享内存对象尚未关联任何底层共享内存段。必须先通过setNativeKey()设置键,才能使用create()或attach()。

此函数重载了QSharedMemory::QSharedMemory()。

另请参阅 setNativeKey()。

QSharedMemory::QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)

创建一个共享内存对象,其parent 为给定值,且键设置为key 。由于其键已设置,因此可以调用其create()和attach()函数。

这是一个重载函数。

另请参见 setNativeKey()、create() 和attach()。

[virtual noexcept] QSharedMemory::~QSharedMemory()

析构函数会清除键,这会强制该共享内存对象从其底层共享内存段中detach 。如果该共享内存对象是连接到该共享内存段的最后一个对象,则detach()操作会销毁该共享内存段。

另请参阅 detach() 和isAttached()。

bool QSharedMemory::attach(QSharedMemory::AccessMode mode = ReadWrite)

尝试将进程附加到由传递给构造函数的键所标识的共享内存段,或附加到通过调用setNativeKey()获得的共享内存段。访问权限mode 默认设置为ReadWrite 。该权限也可设置为ReadOnly 。如果附加操作成功,则返回true 。 若返回 false,请调用error() 以确定发生了何种错误。附加共享内存段后,可通过调用data() 获取指向该共享内存的指针。

另请参阅 isAttached()、detach() 和create()。

const void *QSharedMemory::constData() const

如果已连接共享内存段,则返回指向该段内容的常量指针;否则返回 null。该函数返回的值在调用detach 之前不会改变,因此可以安全地存储该指针。

如果内存操作不是原子的,您可以在读取或写入之前使用lock()锁定共享内存,但请记住,操作完成后要使用unlock()释放锁。

另请参阅 attach() 和create()。

bool QSharedMemory::create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)

创建一个大小为size 字节的共享内存段,其键由构造函数传入或通过setNativeKey()设置,然后使用给定的访问mode 附加到新的共享内存段,并返回true 。如果由该键标识的共享内存段已经存在,则不执行附加操作,并返回false 。当返回值为false 时,请调用error()以确定发生了何种错误。

另请参阅 error()。

void *QSharedMemory::data()

如果已连接共享内存段,则返回指向该段内容的指针;否则返回 null。在调用detach 之前,该函数返回的值不会改变,因此可以安全地存储此指针。

如果内存操作不是原子操作,您可以在读取或写入之前使用lock()锁定共享内存,但请记住,操作完成后要使用unlock()释放锁。

另请参阅 attach()。

const void *QSharedMemory::data() const

该函数重载了QSharedMemory::data()。

bool QSharedMemory::detach()

将进程从共享内存段中分离。如果这是最后一个与该共享内存段关联的进程,则系统会释放该共享内存段,即销毁其内容。 如果成功将进程从共享内存段中分离,该函数返回true 。如果返回false ,通常表示该段要么未被连接,要么已被另一个进程锁定。

另请参阅 attach() 和isAttached()。

QSharedMemory::SharedMemoryError QSharedMemory::error() const

返回一个值,用于指示是否发生了错误;如果发生了错误,则返回该错误的具体类型。

另请参阅 errorString()。

QString QSharedMemory::errorString() const

返回最近一次发生的错误的文本描述。如果error()返回error value ,请调用此函数以获取描述该错误的文本字符串。

另请参阅 error()。

bool QSharedMemory::isAttached() const

如果该进程已连接到共享内存段,则返回true 。

另请参阅 attach() 和detach()。

QString QSharedMemory::key() const

返回通过setKey()分配给该共享内存的旧版键;如果未分配键,或者该段正在使用nativeKey(),则返回空键。该键是Qt应用程序用于识别共享内存段的标识符。

您可以通过调用nativeKey() 获取操作系统使用的原生、平台特定的键。

另请参阅 setKey() 和setNativeKey()。

bool QSharedMemory::lock()

这是一个信号量,用于锁定共享内存段以便本进程访问,并返回true 。如果另一个进程已锁定该内存段,则该函数将阻塞直至锁被释放。 随后它将获取锁并返回true 。如果该函数返回false ,则表示您忽略了create() 或attach() 的假返回值,或者您已通过setNativeKey() 设置了密钥,又或者QSystemSemaphore::acquire() 因未知系统错误而失败。

另请参阅 unlock()、data() 和QSystemSemaphore::acquire()。

[since 6.6] QNativeIpcKey QSharedMemory::nativeIpcKey() const

返回此共享内存对象的键类型。该键类型与nativeKey() 函数互为补充,作为操作系统用于识别共享内存段的标识符。

您可以使用本机密钥访问非由 Qt 创建的共享内存段,或向非 Qt 应用程序授予共享内存访问权限。有关更多信息,请参阅“本机 IPC 密钥”。

该函数于 Qt 6.6 版本中引入。

另请参阅 nativeKey() 和setNativeKey()。

QString QSharedMemory::nativeKey() const

返回此共享内存对象的原生、平台特有的键。原生键是操作系统用于识别共享内存段的标识符。

您可以使用本机键来访问非由 Qt 创建的共享内存段,或向非 Qt 应用程序授予共享内存访问权限。有关更多信息,请参阅“本机 IPC 键”。

另请参阅 setNativeKey() 和nativeIpcKey()。

void QSharedMemory::setKey(const QString &key)

为该共享内存对象设置旧版key 。如果key 与当前密钥相同,则该函数不执行任何操作直接返回。否则,如果该共享内存对象与底层共享内存段相关联,则会在设置新密钥之前将其从该段中detach 。该函数不会执行attach()操作。

您可以调用 `key()` 来检索旧键。该函数与以下函数基本相同:

shm.setNativeKey(QSharedMemory::legacyNativeKey(key));

唯一的区别在于,它支持通过key() 获取旧密钥。

另请参阅 key()、nativeKey() 和isAttached()。

[since 6.6] void QSharedMemory::setNativeKey(const QNativeIpcKey &key)

为该共享内存对象设置原生且与平台相关的key 。如果key 与当前原生密钥相同,则该函数不执行任何操作直接返回。否则,如果该共享内存对象与底层的共享内存段相关联,则会在设置新密钥之前将其从该段中detach 。该函数不会调用attach()。

如果本机密钥是从另一个进程共享而来的,此函数将非常有用。有关更多信息,请参阅“本机 IPC 密钥”。

可移植的本机密钥可通过 platformSafeKey() 获取。

您可以调用nativeKey()来检索本机密钥。

该函数在 Qt 6.6 中引入。

另请参阅 nativeKey()、nativeIpcKey() 和isAttached()。

void QSharedMemory::setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())

为类型为type 的此共享内存对象设置本机、平台特有的key (类型参数自Qt 6.6起可用)。如果key 与当前的本机密钥相同,则该函数不执行任何操作直接返回。 否则,如果共享内存对象已附加到底层共享内存段,则会在设置新密钥之前先将其从该段中detach 。该函数不会执行attach()操作。

如果本机密钥是从另一个进程共享而来的,此函数会很有用,但应用程序必须注意确保密钥类型与其他进程的预期相匹配。有关更多信息,请参阅“本机 IPC 密钥”。

可使用 platformSafeKey() 获取可移植的本机密钥。

您可以调用nativeKey() 来检索本机密钥。

另请参阅 nativeKey()、nativeIpcKey() 和isAttached()。

qsizetype QSharedMemory::size() const

返回已连接的共享内存段的大小。如果未连接任何共享内存段,则返回 0。

注意: 该段的大小 可能大于传递给create() 的请求大小。

另请参阅 create() 和attach()。

bool QSharedMemory::unlock()

释放对共享内存段的锁,如果当前该锁由本进程持有,则返回true 。如果该段未被锁定,或者锁由另一个进程持有,则不执行任何操作并返回false。

另请参阅 lock()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.