2015-04-24 38 views
1

在boost进程的所有示例中,我只能看到它在main()中被初始化。指向boost进程的managed_shared_memory

#include <boost/interprocess/managed_shared_memory.hpp> 
#include <iostream> 

using namespace boost::interprocess; 

int main() 
{ 
    shared_memory_object::remove("Boost"); 
    managed_shared_memory managed_shm(open_or_create, "Boost", 1024); 
    int *i = managed_shm.construct<int>("Integer")(99); 
    std::cout << *i << '\n'; 
    std::pair<int*, std::size_t> p = managed_shm.find<int>("Integer"); 
    if (p.first) 
    std::cout << *p.first << '\n'; 
} 

而不是专门升压的问题,这更是一个C++的问题,我知道我可以创建一个对象,并使用初始化列表初始化managed_shm的,但我想知道是否有声明它的方式像managed_shared_memory * managed_shm;,后来将其初始化为managed_shm = new managed_shm(open_or_create, "Boost", 1024);

我看过managed_shared_memory标题,他们似乎没有提供任何选项。

回答

2

是的。就这样写吧。

#include <boost/interprocess/managed_shared_memory.hpp> 
#include <iostream> 

namespace bip = boost::interprocess; 

struct MyWorker : boost::noncopyable { 
    MyWorker() 
     : _shm(new bip::managed_shared_memory(bip::open_or_create, "089f8a0f-956a-441d-9b9e-e0696c43185f", 10ul<<20)) 
    {} 

    ~MyWorker() { 
     delete _shm; 
    } 
    private: 
    bip::managed_shared_memory* _shm; 
}; 

int main() { 
    MyWorker instance; 
} 

Live On Coliru使用managed_mapped_file代替共享存储器(其不支持Coliru)

当然,更喜欢智能指针。

或者的确,问自己,为什么你需要动态分配(我想不出这个正当理由)

我使用某种API的是(误!)需要一个指针,只取地址:

bip::managed_shared_memory shm(bip::open_or_create, "SHM_NAME", 10ul<<20); 

// calling a badly design API takes a pointer: 
misguided_api_foo(&shm); 
+0

谢谢。我不希望它在初始化列表中的一个原因是,如果它抛出,我无法处理异常。其他原因是能够像我在我的问题中提到的那样宣布它。 – Nav

+0

@Nav原因1:[功能级别尝试块](http://coliru.stacked-crooked.com/a/2bd29f62e6095222)原因2:请参阅我的回答:/。更好的选择:[提取一个函数](http://coliru.stacked-crooked.com/a/55f21ee69e15fee2)或者只使用[可选](http://coliru.stacked-crooked.com/a/f5fdb50b1af68d50) – sehe

+0

总结:不要使用'new'和'delete'。你几乎总是可以避免它(以及随之而来的类错误) – sehe

相关问题