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() を使用することで、クロスプラットフォームな方法で作成できます。
1つのQSharedMemoryオブジェクトが、そのセグメントに対してcreate()を呼び出す必要があり、この呼び出しでセグメントのサイズが指定されます。他のすべてのプロセスは、すでに存在しているセグメントに対して単にattach()を呼び出すだけで済みます。いずれかの操作が成功した後、アプリケーションはdata()を呼び出して、データへのポインタを取得できます。
非アトミック操作をサポートするため、QSharedMemory は排他アクセスを取得するための API を提供しています。共有メモリからの読み取りや書き込みを行う前に、lock() を使用して共有メモリをロックできますが、処理終了後はunlock() を使用してロックを解除することを忘れないでください。
デフォルトでは、QSharedMemory の最後のインスタンスがセグメントからdetached され、そのセグメントへの参照が一切残っていない場合、QSharedMemory は自動的にその共有メモリセグメントを破棄します。
キーのタイプ、プラットフォーム固有の制限、および古いアプリケーションやQt以外のアプリケーションとの相互運用性に関する詳細については、「Native IPC Keys」のドキュメントを参照してください。これには、Apple App Store経由で入手したすべてのアプリを含む、Appleプラットフォーム上のサンドボックス化されたアプリケーションに関する重要な情報が含まれています。
「プロセス間通信」および「QSystemSemaphore 」も参照してください 。
メンバ型のドキュメント
enum QSharedMemory::AccessMode
| 定数 | 値 | 説明 |
|---|---|---|
QSharedMemory::ReadOnly | 0 | 共有メモリセグメントは読み取り専用です。共有メモリセグメントへの書き込みは許可されません。ReadOnly オプションで作成された共有メモリセグメントへの書き込みを試みると、プログラムは異常終了します。 |
QSharedMemory::ReadWrite | 1 | 共有メモリセグメントの読み取りと書き込みの両方が許可されます。 |
enum QSharedMemory::SharedMemoryError
| 定数 | 値 | 説明 |
|---|---|---|
QSharedMemory::NoError | 0 | エラーは発生しませんでした。 |
QSharedMemory::PermissionDenied | 1 | 呼び出し元に必要な権限がなかったため、操作が失敗しました。 |
QSharedMemory::InvalidSize | 2 | 要求されたサイズが無効だったため、作成操作が失敗しました。 |
QSharedMemory::KeyError | 3 | キーが無効なため、操作が失敗しました。 |
QSharedMemory::AlreadyExists | 4 | 指定されたキーを持つ共有メモリセグメントがすでに存在していたため、create() 操作が失敗しました。 |
QSharedMemory::NotFound | 5 | 指定されたキーを持つ共有メモリセグメントが見つからなかったため、attach() が失敗しました。 |
QSharedMemory::LockError | 6 | create() またはattach() が失敗して false を返したか、QSystemSemaphore::acquire() でシステムエラーが発生したため、共有メモリセグメントのlock() 操作が失敗しました。 |
QSharedMemory::OutOfResources | 7 | create() 操作は、要求を満たすのに十分なメモリが利用できなかったため失敗しました。 |
QSharedMemory::UnknownError | 8 | その他の問題が発生し、それが原因で処理が失敗しました。 |
メンバ関数のドキュメント
QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)
指定されたparent と、レガシーキーがkey に設定された共有メモリオブジェクトを構築します。キーが設定されているため、create()およびattach()関数を呼び出すことができます。
setKey()、create()、およびattach()も参照してください 。
QSharedMemory::QSharedMemory(QObject *parent = nullptr)
指定されたparent を用いて、共有メモリオブジェクトを構築します。この共有メモリオブジェクトのキーはコンストラクタによって設定されないため、この共有メモリオブジェクトには基盤となる共有メモリセグメントが関連付けられていません。create()またはattach()を使用するには、事前にsetNativeKey()でキーを設定しておく必要があります。
この関数は、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
共有メモリセグメントが接続されている場合、その内容へのconstポインタを返します。そうでない場合はnullを返します。この関数が返す値は、detach が実行されるまで変化しないため、このポインタを格納しても安全です。
メモリ操作がアトミックでない場合は、読み取りや書き込みを行う前にlock()で共有メモリをロックすることができますが、処理終了後はunlock()でロックを解除することを忘れないでください。
attach() およびcreate()も参照してください 。
bool QSharedMemory::create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
コンストラクタに渡された、またはsetNativeKey() で設定されたキーを持つ、size バイトの共有メモリセグメントを作成し、指定されたアクセス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() を使用している場合は、null キーを返します。このキーは、Qt アプリケーションが共有メモリセグメントを識別するために使用する識別子です。
オペレーティングシステムで使用される、ネイティブかつプラットフォーム固有のキーは、nativeKey() を呼び出すことで取得できます。
setKey() およびsetNativeKey()も参照してください 。
bool QSharedMemory::lock()
これは、このプロセスによるアクセスのために共有メモリセグメントをロックし、true を返すセマフォです。別のプロセスがそのセグメントをロックしている場合、この関数はロックが解放されるまでブロックします。 その後、ロックを取得し、true を返します。この関数がfalse を返した場合は、create()またはattach()からのfalseの戻り値を無視したか、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 を設定します(typeパラメータはQt 6.6以降で利用可能になりました)。key が現在のネイティブキーと同じ場合、この関数は何も実行せずに戻ります。 それ以外の場合、共有メモリオブジェクトが基になる共有メモリセグメントにアタッチされているときは、新しいキーを設定する前に、そこからdetach を行います。この関数はattach()を実行しません。
この関数は、ネイティブキーが別のプロセスから共有されていた場合に有用ですが、アプリケーションはキーの型が相手側のプロセスの期待するものと一致するように注意する必要があります。詳細については、「ネイティブIPCキー」を参照してください。
移植性のあるネイティブキーは、platformSafeKey() を使用して取得できます。
nativeKey() を呼び出すことで、ネイティブキーを取得できます。
nativeKey()、nativeIpcKey()、およびisAttached()も参照してください 。
qsizetype QSharedMemory::size() const
アタッチされた共有メモリセグメントのサイズを返します。共有メモリセグメントがアタッチされていない場合は、0 が返されます。
注: セグメントのサイズは 、create() に渡された要求サイズよりも大きくなる場合があります。
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.