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()

我不是绝对肯定的,但我相信警告是由于没有初始化向量引起的?如果是这样,我们如何初始化将存储在数据段中的向量?

我还有一个问题,将向量存储在 DLL 中的数据段中是不是一个糟糕的主意?

我的目标

我正在尝试在 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 回答