3

情報

次の警告:
LINK : warning LNK4039: section '.SHARED' specified with /SECTION option does not exist
C++ でダイナミック リンク ライブラリのデータ セグメントにベクトルを格納しようとすると常に発生します。

例:

#include <vector>

struct Obj {
   unsigned int A;
   unsigned int B;
   bool C;
   std::vector< unsigned char > D;
};

#pragma data_seg( ".SHARED" )
std::vector< Obj > Objects;
#pragma data_seg()

#pragma comment ( linker,"/section:.SHARED,RWS" )

ただし、単純な変数を格納しようとすると、コンパイル時に警告は表示されません。このような:

#pragma data_seg (".SHARED" )
int SimpleVariable = 0;
#pragma data_seg()

私は絶対に肯定的ではありませんが、ベクトルを初期化していないために警告が発生したと思いますか? もしそうなら、データ セグメント内に格納されるベクトルをどのように初期化できますか?

もう 1 つ質問があります。ベクトルを DLL 内のデータ セグメントに格納するのはひどい考えですか?

私の目標

複数の異なるプロセスにロードされる DLL 内でベクターのコンテンツを共有しようとしています。

このような:

process_1.exe
    - example.dll -|    * access the same vector (SomeVector) as
                   |      example.dll within process_2
                   |
                std::vector SomeVector; // vector in example.dll
                   |
process_2.exe      |    * access the same vector (SomeVector) as
                   |      example.dll within process_1
    - example.dll -|    
4

1 に答える 1

0

http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).aspx

std::vector<> はどのように初期化されますか?

はい、共有データ セグメントを使用するのはひどい考えです。

実行中のコードはそのプログラムのプロセス空間内にあるため、そのプロセスのアドレス空間からベクトルにメモリを割り当てることをデフォルトにします。他のプロセスが読み取りまたは書き込みを試みて例外をスローします。

独自の _alloc を記述してシステム共有メモリからプルすることはできますが、これでは初期化の問題は解決されません。

ipc の推奨される方法は、メモリ マップ ファイルとミューテックスを使用することです。

これを希望どおりに機能させるには、大量のコードが必要になります。そのテンプレートからクラスを派生させるか、より高速なルートを選択して、ゼロから独自のクラスを作成できるようになるまで、Std:Vector コードを快適に確認してください。

于 2014-02-17T22:55:10.590 に答える