将共享内存地址值打印到命令行

时间:2016-04-27 14:36:24

标签: c++ boost char shared-memory cout

我正在尝试使用boost的共享内存库来进行一些进程间通信(VS 2015)。我发现example online非常有帮助。为了理智,我只想执行一个简单的检查,即我写入共享内存地址的值是我想要的。为此,我想使用cout打印共享内存的值。这是我目前的代码:

#include <boost\interprocess\shared_memory_object.hpp>
#include <boost\interprocess\mapped_region.hpp>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <cstring>
#include <cstdlib>
#include <string>

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

    struct shm_remove
    {
        shm_remove() { shared_memory_object::remove("MySharedMemory"); }
        ~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
    } remover;

    //Create a shared memory object
    shared_memory_object shm(create_only, "MySharedMemory", read_write);

    //Set size to 1
    shm.truncate(1);

    //Map the whole shared memory in this process
    mapped_region region(shm, read_write);

    //Write all the memory to 1
    std::memset(region.get_address(), 1, region.get_size());

    //Check that memory was initialized to 1
    char *mem = static_cast<char*>(region.get_address());

    for (std::size_t i = 0; i < region.get_size(); ++i)
    {
        std::cout << "Memory value: " << *mem << "\n";
        if (*mem++ != 1)
        {
            return 1;   //Error checking memory
        }
    }
    std::cout << "press any key to quit";
    _getch();
}

代码工作正常,当它检查映射的内存已设置为1时,不会抛出任何错误。但是,当我尝试打印我认为应该是地址的值时,我得到一个笑脸......

enter image description here

有人能指出我正确的方向吗?我有一些怀疑(没有终止\ 0?)但我真的不明白这里的内部运作。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

明确地将mem投射到int,然后std::cout将输出值作为数字,而不是与mem中存储的ASCII代码对应的字母(这可能是不可打印的或看起来很有趣,后者就是你的情况。)

请参阅cout not printing unsigned char以获得有关此问题的更全面的答案。

答案 1 :(得分:2)

控制台显示内存中字节的ASCII表示形式。 13岁以下的任何角色通常都是不可打印的。尝试将内存设置为67。