【问题标题】:Getting pointers to managed_shared_memory of boost interprocess获取指向 boost 进程间 managed_shared_memory 的指针
【发布时间】:2015-07-02 21:35:03
【问题描述】:

在 boost 进程间的所有示例中,我只看到它在 main() 中初始化。

#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,但我想知道是否有办法像 @ 一样声明它987654324@ 然后像managed_shm = new managed_shm(open_or_create, "Boost", 1024); 一样初始化它?

我已经看到了 managed_shared_memory 标头,但他们似乎没有提供任何选项。

【问题讨论】:

    标签: c++ boost boost-interprocess


    【解决方案1】:

    是的,当然。就这样写吧。

    #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);
    

    【讨论】:

    • 谢谢。我不希望它出现在初始化列表中的一个原因是,如果它抛出,我将无法处理异常。其他原因是能够像我在问题中提到的那样声明它。
    • @Nav 原因 1:function-level try blocks 原因 2:看我的答案:/。更好的选择:extract a function 或只是 use optional
    • 总结:不要使用newdelete。您几乎总是可以避免它(以及随之而来的错误类别)
    • 谢谢。虽然我同意您对newdelete 的评论,但我正在开发一个应用程序,当使用引用计数的boost 指针容器而不是简单数组时,该应用程序的运行速度要慢三倍。为了提高效率,我们中的一些人不得不在内存管理方面承担必要的风险。
    • 这几乎是零意义。一方面原始指针和手动内存管理与另一方面引用计数的智能指针之间存在很大差异。你不能比较这些。除此之外,这些都不能解释为什么要动态分配段经理。关键是你可以更安全地做《同样的工作》。做“其他事情”较慢的事实无关紧要。我们所有使用 c++ 的人都在承担所需的额外风险。因为否则为什么要使用 c++?
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多