QSharedMemory Class
Die Klasse „QSharedMemory“ ermöglicht den Zugriff auf ein gemeinsam genutztes Speichersegment. Mehr...
| Header: | #include <QSharedMemory> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Erbt von: | QObject |
Öffentliche Typen
| enum | AccessMode { ReadOnly, ReadWrite } |
| enum | SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, AlreadyExists, …, UnknownError } |
Öffentliche Funktionen
| 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() |
Ausführliche Beschreibung
QSharedMemory ermöglicht mehreren Threads und Prozessen den Zugriff auf ein gemeinsam genutztes Speichersegment. Gemeinsam genutzte Speichersegmente werden durch einen Schlüssel identifiziert, der durch ` QNativeIpcKey` dargestellt wird. Ein Schlüssel kann plattformübergreifend mithilfe von `platformSafeKey()` erstellt werden.
Ein QSharedMemory-Objekt muss das Segment mit ` create()` anlegen, wobei dieser Aufruf die Größe des Segments festlegt. Alle anderen Prozesse rufen lediglich ` attach()` für das Segment auf, das bereits vorhanden sein muss. Nachdem eine der beiden Operationen erfolgreich abgeschlossen wurde, kann die Anwendung ` data()` aufrufen, um einen Zeiger auf die Daten zu erhalten.
Zur Unterstützung nicht-atomarer Operationen bietet QSharedMemory eine API für den exklusiven Zugriff: Sie können den gemeinsamen Speicher mit ` lock()` sperren, bevor Sie aus dem gemeinsamen Speicher lesen oder in ihn schreiben; denken Sie jedoch daran, die Sperre nach Abschluss des Vorgangs mit ` unlock()` wieder aufzuheben.
Standardmäßig zerstört QSharedMemory das Shared-Memory-Segment automatisch, wenn die letzte Instanz von QSharedMemory mit ` detached ` aus dem Segment entfernt wird und keine Verweise mehr auf das Segment bestehen.
Einzelheiten zu den Schlüsseltypen, plattformspezifischen Einschränkungen und der Interoperabilität mit älteren oder Nicht-Qt-Anwendungen finden Sie in der Dokumentation zu „Native IPC Keys “. Diese enthält wichtige Informationen für Sandbox-Anwendungen auf Apple-Plattformen, einschließlich aller Apps, die über den Apple App Store bezogen wurden.
Siehe auch „Interprozesskommunikation“ und „ QSystemSemaphore “.
Dokumentation zu Mitgliedstypen
enum QSharedMemory::AccessMode
| Konstante | Wert | Beschreibung |
|---|---|---|
QSharedMemory::ReadOnly | 0 | Das Shared-Memory-Segment ist schreibgeschützt. Das Schreiben in das Shared-Memory-Segment ist nicht zulässig. Ein Versuch, in ein mit „ReadOnly“ erstelltes Shared-Memory-Segment zu schreiben, führt zum Abbruch des Programms. |
QSharedMemory::ReadWrite | 1 | Sowohl das Lesen als auch das Schreiben in das Shared-Memory-Segment sind zulässig. |
enum QSharedMemory::SharedMemoryError
| Konstante | Wert | Beschreibung |
|---|---|---|
QSharedMemory::NoError | 0 | Es ist kein Fehler aufgetreten. |
QSharedMemory::PermissionDenied | 1 | Der Vorgang ist fehlgeschlagen, da der Aufrufer nicht über die erforderlichen Berechtigungen verfügte. |
QSharedMemory::InvalidSize | 2 | Ein Erstellungsvorgang ist fehlgeschlagen, da die angeforderte Größe ungültig war. |
QSharedMemory::KeyError | 3 | Der Vorgang ist aufgrund eines ungültigen Schlüssels fehlgeschlagen. |
QSharedMemory::AlreadyExists | 4 | Ein „ create()“-Vorgang ist fehlgeschlagen, da bereits ein gemeinsam genutztes Speichersegment mit dem angegebenen Schlüssel existierte. |
QSharedMemory::NotFound | 5 | Ein „ attach()“-Vorgang ist fehlgeschlagen, da ein gemeinsam genutztes Speichersegment mit dem angegebenen Schlüssel nicht gefunden werden konnte. |
QSharedMemory::LockError | 6 | Der Versuch, das gemeinsam genutzte Speichersegment mit ` lock()` zu erstellen, schlug fehl, da entweder ` create()` oder ` attach()` fehlgeschlagen ist und den Wert `false` zurückgegeben hat oder weil bei ` QSystemSemaphore::acquire()` ein Systemfehler aufgetreten ist. |
QSharedMemory::OutOfResources | 7 | Ein create()-Vorgang ist fehlgeschlagen, da nicht genügend Speicher zur Verfügung stand, um die Anforderung zu erfüllen. |
QSharedMemory::UnknownError | 8 | Es ist etwas anderes passiert, und das war nicht gut. |
Dokumentation der Member-Funktionen
QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)
Erstellt ein Shared-Memory-Objekt mit dem angegebenen „ parent “ und dem auf „ key “ gesetzten Legacy-Schlüssel. Da der Schlüssel festgelegt ist, können die Funktionen „ create()“ und „ attach()“ aufgerufen werden.
Siehe auch setKey(), create() und attach().
QSharedMemory::QSharedMemory(QObject *parent = nullptr)
Erstellt ein Shared-Memory-Objekt mit dem angegebenen ` parent`. Der Schlüssel des Shared-Memory-Objekts wird vom Konstruktor nicht gesetzt, sodass dem Shared-Memory-Objekt kein zugrunde liegendes Shared-Memory-Segment zugeordnet ist. Der Schlüssel muss mit ` setNativeKey()` gesetzt werden, bevor ` create()` oder ` attach()` verwendet werden können.
Diese Funktion überlädt die Funktion ` QSharedMemory::QSharedMemory()`.
Siehe auch „ setNativeKey()“.
QSharedMemory::QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)
Erstellt ein Shared-Memory-Objekt mit dem angegebenen ` parent ` und einem Schlüssel, der auf ` key` gesetzt ist. Da der Schlüssel festgelegt ist, können die Funktionen ` create()` und ` attach()` aufgerufen werden.
Dies ist eine überladene Funktion.
Siehe auch setNativeKey(), create() und attach().
[virtual noexcept] QSharedMemory::~QSharedMemory()
Der Destruktor löscht den Schlüssel, wodurch das Shared-Memory-Objekt gezwungen wird, sich aus seinem zugrunde liegenden Shared-Memory-Segment zu detach. Ist dieses Shared-Memory-Objekt das letzte, das mit dem Shared-Memory-Segment verbunden ist, zerstört die Operation detach() das Shared-Memory-Segment.
Siehe auch „ detach()“ und „ isAttached()“.
bool QSharedMemory::attach(QSharedMemory::AccessMode mode = ReadWrite)
Versucht, den Prozess an das Shared-Memory-Segment anzuhängen, das durch den an den Konstruktor übergebenen Schlüssel oder durch einen Aufruf von ` setNativeKey()` identifiziert wird. Die Zugriffs mode ist standardmäßig ` ReadWrite `. Sie kann auch ` ReadOnly` lauten. Gibt ` true ` zurück, wenn der Anhängevorgang erfolgreich war. Wird „false“ zurückgegeben, rufen Sie „ error()“ auf, um festzustellen, welcher Fehler aufgetreten ist. Nach dem Anfügen des gemeinsam genutzten Speichersegments kann ein Zeiger auf den gemeinsam genutzten Speicher durch Aufruf von „ data()“ abgerufen werden.
Siehe auch „ isAttached()“, „ detach()“ und „ create()“.
const void *QSharedMemory::constData() const
Gibt einen const-Zeiger auf den Inhalt des Shared-Memory-Segments zurück, sofern eines angehängt ist. Andernfalls wird null zurückgegeben. Der von dieser Funktion zurückgegebene Wert ändert sich erst, wenn ein „ detach “ auftritt; daher ist es unbedenklich, diesen Zeiger zu speichern.
Wenn die Speicheroperationen nicht atomar sind, kannst du den gemeinsam genutzten Speicher vor dem Lesen oder Schreiben mit ` lock()` sperren, musst aber daran denken, die Sperre nach Abschluss des Vorgangs mit ` unlock()` wieder aufzuheben.
Siehe auch attach() und create().
bool QSharedMemory::create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
Erstellt ein Shared-Memory-Segment von size Bytes mit dem an den Konstruktor übergebenen oder mit setNativeKey() festgelegten Schlüssel, verbindet sich dann mit dem neuen Shared-Memory-Segment unter Verwendung des angegebenen Zugriffs mode s und gibt true zurück. Wenn bereits ein durch den Schlüssel identifiziertes Shared-Memory-Segment existiert, wird die Verbindungsoperation nicht ausgeführt und false zurückgegeben. Wenn der Rückgabewert false lautet, rufen Sie error() auf, um festzustellen, welcher Fehler aufgetreten ist.
Siehe auch „ error()“.
void *QSharedMemory::data()
Gibt einen Zeiger auf den Inhalt des Shared-Memory-Segments zurück, sofern eines angehängt ist. Andernfalls wird null zurückgegeben. Der von dieser Funktion zurückgegebene Wert ändert sich erst, wenn ein „ detach “ auftritt; daher ist es unbedenklich, diesen Zeiger zu speichern.
Wenn die Speicheroperationen nicht atomar sind, können Sie den gemeinsamen Speicher vor dem Lesen oder Schreiben mit ` lock()` sperren, müssen jedoch daran denken, die Sperre nach Abschluss des Vorgangs mit ` unlock()` wieder aufzuheben.
Siehe auch ` attach()`.
const void *QSharedMemory::data() const
Diese Funktion überlädt die Funktion „ QSharedMemory::data()“.
bool QSharedMemory::detach()
Trennt den Prozess vom Shared-Memory-Segment. War dies der letzte Prozess, der mit dem Shared-Memory-Segment verbunden war, wird das Shared-Memory-Segment vom System freigegeben, d. h., der Inhalt wird gelöscht. Die Funktion gibt „ true “ zurück, wenn sie das Shared-Memory-Segment trennt. Gibt sie „ false “ zurück, bedeutet dies in der Regel, dass das Segment entweder nicht verbunden ist oder von einem anderen Prozess gesperrt ist.
Siehe auch ` attach()` und ` isAttached()`.
QSharedMemory::SharedMemoryError QSharedMemory::error() const
Gibt einen Wert zurück, der angibt, ob ein Fehler aufgetreten ist und, falls ja, um welchen Fehler es sich handelt.
Siehe auch „ errorString()“.
QString QSharedMemory::errorString() const
Gibt eine Textbeschreibung des zuletzt aufgetretenen Fehlers zurück. Wenn „ error()“ einen „ error value “ zurückgibt, rufen Sie diese Funktion auf, um eine Textzeichenfolge zu erhalten, die den Fehler beschreibt.
Siehe auch ` error()`.
bool QSharedMemory::isAttached() const
Gibt „ true “ zurück, wenn dieser Prozess an das gemeinsam genutzte Speichersegment angehängt ist.
Siehe auch „ attach()“ und „ detach()“.
QString QSharedMemory::key() const
Gibt den mit ` setKey()` diesem gemeinsam genutzten Speicher zugewiesenen Legacy-Schlüssel zurück oder einen Null-Schlüssel, wenn kein Schlüssel zugewiesen wurde oder wenn das Segment ` nativeKey()` verwendet. Der Schlüssel ist die Kennung, die von Qt-Anwendungen zur Identifizierung des gemeinsam genutzten Speichersegments verwendet wird.
Den nativen, plattformspezifischen Schlüssel, der vom Betriebssystem verwendet wird, können Sie durch Aufruf von ` nativeKey()` ermitteln.
Siehe auch „ setKey()“ und „ setNativeKey()“.
bool QSharedMemory::lock()
Dies ist ein Semaphor, der das gemeinsam genutzte Speichersegment für den Zugriff durch diesen Prozess sperrt und „ true “ zurückgibt. Wenn ein anderer Prozess das Segment gesperrt hat, blockiert diese Funktion, bis die Sperre aufgehoben wird. Anschließend erlangt sie die Sperre und gibt „ true “ zurück. Wenn diese Funktion „ false “ zurückgibt, bedeutet dies, dass Sie eine falsche Rückgabe von „ create()“ oder „ attach()“ ignoriert haben, dass Sie den Schlüssel mit „ setNativeKey()“ gesetzt haben oder dass „ QSystemSemaphore::acquire()“ aufgrund eines unbekannten Systemfehlers fehlgeschlagen ist.
Siehe auch unlock(), data() und QSystemSemaphore::acquire().
[since 6.6] QNativeIpcKey QSharedMemory::nativeIpcKey() const
Gibt den Schlüsseltyp für dieses Shared-Memory-Objekt zurück. Der Schlüsseltyp ergänzt die Funktion „ nativeKey()“ als Bezeichner, den das Betriebssystem zur Identifizierung des Shared-Memory-Segments verwendet.
Sie können den nativen Schlüssel verwenden, um auf Shared-Memory-Segmente zuzugreifen, die nicht von Qt erstellt wurden, oder um Nicht-Qt-Anwendungen Zugriff auf Shared Memory zu gewähren. Weitere Informationen finden Sie unter „Native IPC-Schlüssel “.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch „ nativeKey()“ und „ setNativeKey()“.
QString QSharedMemory::nativeKey() const
Gibt den nativen, plattformspezifischen Schlüssel für dieses Shared-Memory-Objekt zurück. Der native Schlüssel ist die Kennung, die vom Betriebssystem zur Identifizierung des Shared-Memory-Segments verwendet wird.
Sie können den nativen Schlüssel verwenden, um auf Shared-Memory-Segmente zuzugreifen, die nicht von Qt erstellt wurden, oder um Nicht-Qt-Anwendungen Zugriff auf den Shared Memory zu gewähren. Weitere Informationen finden Sie unter „Native IPC-Schlüssel “.
Siehe auch „ setNativeKey()“ und „ nativeIpcKey()“.
void QSharedMemory::setKey(const QString &key)
Legt den alten Schlüssel „ key “ für dieses Shared-Memory-Objekt fest. Wenn „ key “ mit dem aktuellen Schlüssel übereinstimmt, kehrt die Funktion ohne weitere Aktion zurück. Andernfalls wird – sofern das Shared-Memory-Objekt an ein zugrunde liegendes Shared-Memory-Segment angehängt ist – zunächst eine „ detach “ von diesem Segment durchgeführt, bevor der neue Schlüssel gesetzt wird. Diese Funktion führt keinen „ attach()“-Aufruf durch.
Sie können ` key()` aufrufen, um den alten Schlüssel abzurufen. Diese Funktion entspricht weitgehend folgendem Befehl:
shm.setNativeKey(QSharedMemory::legacyNativeKey(key));mit dem Unterschied, dass sie das Abrufen des alten Schlüssels über ` key()` ermöglicht.
Siehe auch key(), nativeKey() und isAttached().
[since 6.6] void QSharedMemory::setNativeKey(const QNativeIpcKey &key)
Legt den nativen, plattformspezifischen Schlüssel „ key “ für dieses Shared-Memory-Objekt fest. Wenn „ key “ mit dem aktuellen nativen Schlüssel übereinstimmt, kehrt die Funktion ohne weitere Aktion zurück. Andernfalls, sofern das Shared-Memory-Objekt an ein zugrunde liegendes Shared-Memory-Segment angehängt ist, wird die Verbindung zu diesem Segment getrennt („ detach “), bevor der neue Schlüssel festgelegt wird. Diese Funktion führt keinen „ attach()“-Aufruf durch.
Diese Funktion ist nützlich, wenn der native Schlüssel von einem anderen Prozess freigegeben wurde. Weitere Informationen finden Sie unter „Native IPC-Schlüssel “.
Portable native Schlüssel können mit `platformSafeKey()` abgerufen werden.
Sie können ` nativeKey()` aufrufen, um den nativen Schlüssel abzurufen.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch „ nativeKey()“, „ nativeIpcKey()“ und „ isAttached()“.
void QSharedMemory::setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
Legt den nativen, plattformspezifischen Schlüssel „ key “ für dieses Shared-Memory-Objekt vom Typ „ type “ fest (der Typ-Parameter ist seit Qt 6.6 verfügbar). Wenn „ key “ mit dem aktuellen nativen Schlüssel übereinstimmt, kehrt die Funktion ohne weitere Aktion zurück. Andernfalls, wenn das Shared-Memory-Objekt an ein zugrunde liegendes Shared-Memory-Segment angehängt ist, wird es von diesem „ detach “ (abgekoppelt), bevor der neue Schlüssel gesetzt wird. Diese Funktion führt kein „ attach()“ aus.
Diese Funktion ist nützlich, wenn der native Schlüssel von einem anderen Prozess gemeinsam genutzt wurde; die Anwendung muss jedoch sicherstellen, dass der Schlüsseltyp mit den Erwartungen des anderen Prozesses übereinstimmt. Weitere Informationen finden Sie unter „Native IPC-Schlüssel “.
Portable native Schlüssel können mit `platformSafeKey()` abgerufen werden.
Sie können ` nativeKey()` aufrufen, um den nativen Schlüssel abzurufen.
Siehe auch „ nativeKey()“, „ nativeIpcKey()“ und „ isAttached()“.
qsizetype QSharedMemory::size() const
Gibt die Größe des angehängten Shared-Memory-Segments zurück. Ist kein Shared-Memory-Segment angehängt, wird 0 zurückgegeben.
Hinweis: Die Größe des Segments kann größer sein als die angeforderte Größe, die an ` create()` übergeben wurde.
Siehe auch create() und attach().
bool QSharedMemory::unlock()
Gibt die Sperre für das gemeinsam genutzte Speichersegment frei und gibt „ true “ zurück, sofern die Sperre derzeit von diesem Prozess gehalten wird. Ist das Segment nicht gesperrt oder wird die Sperre von einem anderen Prozess gehalten, geschieht nichts und es wird „false“ zurückgegeben.
Siehe auch ` 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.