• ベストアンサー

Vector定義の配列の共有メモリ化

Vectorの1次元配列(以下配列Vとします)を共有メモリとして、複数のアプリケーションで利用する方法がわかりません。開発ツールはVC++6.0 SP6です。 配列Vの値を参照時、書込時にはポインタ渡し(memcpy)をしたいです。コンパイルは通るのですが、アプリケーションを実行時にmemcpyを実行時に落ちます。 以下のことを確認しています。 (1)resizeでサイズは同じにしています。 (2)変数自体はNULLではありませんでした(デバッカで確認すると、アドレスがありました。) (3)変数の定義時にVectorにせず、サイズ決めた配列にするとポインタ渡しはできています。パラメータファイルを参照し、配列のサイズを決めたいので、ソース上に記入するのはできません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

>配列Vの値を参照時、書込時にはポインタ渡し(memcpy)をしたいです。 >コンパイルは通るのですが、アプリケーションを実行時にmemcpyを実行時に落ちます。 「Vectorの1次元配列」が「std::vector」の事だと仮定すると、内容の参照は「*演算子の付いたイテレータのみ」で、要素の変更は「erase()メソッドとinsert()メソッドのみ」で、行います。 各要素はポインタではアクセス出来ません。イテレータによりアクセスします。 イテレータも、インスタンスにより生成される変数ですから、その変数のアクセスには、メンバ関数を使用します。 イテレータは、見た感じ「ポインタアクセスのよう」ですが、実際の実装では「色々な演算子がオーバーライドされ、メンバ関数が呼ばれている」のです。 当然、インスタンスにより生成された変数は、memcpyなど、ポインタ渡しは出来ません。ポインタとしてmemcpyなどに渡せば、実行時に「不正なアドレスが参照される」ので、例外終了します。 また、インスタンスにより生成した変数は「生成したプロセス内でのみ有効」であり、それを共有メモリに置いて他のプロセスから参照しても、意味のあるデータにはなりません。 Windowsなど、複数のプロセスを同時に実行できるオペレーティングシステムでは「プロセスごとにメモリ空間が独立しているので、メモリアドレスは複数のプロセス間で共有する事はできない」のです。 そして「インスタンスにより生成した変数」とは、言い換えれば「オブジェクトへのポインタ変数」です。つまり「何かのメモリアドレスを持つポインタ」です。 つまり「インスタンスにより生成した変数は、中身はメモリアドレスなので、複数のプロセス間で共有する事はできない」のです。

その他の回答 (2)

  • simi5
  • ベストアンサー率71% (5/7)
回答No.3

> 配列Vの値を参照時、書込時にはポインタ渡し(memcpy)をしたいです。コンパイルは通るのですが、アプリケーションを実行時にmemcpyを実行時に落ちます。 Vectorの変数定義部分と↑の部分のソースを提示できますか? (Vectorが何か?とか、memcpyに渡しているのが具体的になにか?等分からないので。) 情報ソースは失念しましたが、std::vectorの要素は連続したメモリ領域に配置されますが、配置のされかたは配列と同じになることが保証されるというような記述がありました。 これが真実と仮定するなら、先頭の要素のポインタでmemcpyすることにより、ご希望のことが出来ると思います。(同一プロセス内での要素の参照なら、一応特定の環境で実績があります。)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

共有メモリって、サイズを可変にできないので、そもそも無理があると思うな。 あと、Vectorってのは、std::vectorのことでしょうか?