boost :: interprocess — std :: string vs. std :: vector

如何解决boost :: interprocess — std :: string vs. std :: vector

|| 我使用boost :: interprocess :: managed_(windows_)shared_memory :: construct构造一个拥有自己类的进程间向量,该类具有一个成员变量std :: string和另一个类型std :: vector,所以:
class myclass
{
    public:
        myclass()
        {

        }

        std::string _mystring;
        std::vector < int > _myintvector;
};

template < class _type >
struct typedefs
{
    typedef boost::interprocess::managed_windows_shared_memory     _memory;
    typedef _memory::segment_manager                               _manager;
    typedef boost::interprocess::allocator < _type,_manager >     _allocator;
    typedef boost::interprocess::vector < _type,_allocator >      _vector;
};

typedef typedefs < myclass > tdmyclass;

int main ()
{
    using namespace boost::interprocess;

    managed_windows_shared_memory mem ( open_or_create,\"mysharedmemory\",65536 );
    tdmyclass::_vector * vec = mem.construct < tdmyclass::_vector > ( \"mysharedvector\" ) ( mem.get_segment_manager() );
    myclass mytemp;

    mytemp._mystring = \"something\";
    mytemp._myintvector.push_back ( 100 );
    mytemp._myintvector.push_back ( 200 );

    vec->push_back ( mytemp );

    /* waiting for the memory to be read is not what this is about,so just imagine the programm stops here until everything we want to do is done */
}
我只是为了测试而做,我预计std :: string和std :: vector都不起作用,但是,如果我从另一个进程中读取它,则std :: string实际上有效,它包含我分配的字符串。真的让我感到惊讶。 另一侧的std :: vector仅部分起作用,size()返回的值是正确的,但是如果我要访问迭代器或使用operator [],则程序崩溃。 所以,我的问题是,为什么会这样呢?我的意思是,我从未真正阅读过Visual Studio SDK的STL实现,但std :: string仅仅是具有附加功能的std :: vector的新功能吗?他们不是都使用std :: allocator-这意味着std :: string和std :: vector都不能在共享内存中工作吗? 谷歌搜索实际上并没有导致什么,除了boost :: interprocess :: vector,那不是我搜索内容。所以我希望有人能给我一些有关发生的事情的详细信息^^ PS:如果我在上面的代码中打错了文字,请原谅我,我现在才在此页面编辑器中编写它,我还用一种方式来自动完成我的IDE ^^     

解决方法

        
std::string
之所以有效,是因为您的标准库实现使用小字符串优化(SSO)。这意味着将字符串“ 2”的值复制到字符串对象本身,而没有任何动态内存分配。因此,您可以从其他过程中读取它。对于更长的字符串(尝试输入30个字符),它将不起作用。
std::vector
不起作用,因为标准不允许它使用SSO。它在第一个进程的地址空间中分配内存,但是其他进程无法访问该内存。
.size()
之所以起作用,是因为它作为成员存储在向量本身内部。 附言ѭ5和ѭ6之间有很多区别。从标准的角度来看,最重要的一点也是最起码的提及,“ 5”不是一个容器。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?