代码之家  ›  专栏  ›  技术社区  ›  jun

C++是导致内存泄漏的TyEXFF的错误参数吗?

  •  2
  • jun  · 技术社区  · 6 年前

    下面的代码创建内存泄漏

    void example_funcA(
    const std::shared_ptr<A>& object,
    const std::function<void(void)>& next) 
    {
      ... 
      next(); 
      ...
    }
    
    ...
    
    void example_funcB(const std::shared_ptr<A>& object)
    {...}
    

    /起初我们做了错误的编码。 typedef FuncA

    auto implA_ = std::make_shared<implA>(.....);
    typedef void (implA::*FuncB)(const std::shared_ptr<A>&);
    
    typedef std::function<void(void)> Func;
    
    typedef void (implA::*FuncA)(
          const std::shared_ptr<A>&,
          std::function<void(void)>);
    
      auto next = (Func)std::bind((FuncB)&implA::example_funcB, implA_, object);
    
      implA_->async(std::bind((FuncA)&implA::example_funcA, implA_, object, next));
    

    此代码无法通过智能指针删除类A的对象,导致内存泄漏。

    typedef void (implA::*FuncA)(
          const std::shared_ptr<A>&,
          std::function<void(void)>);
    -> fix code
    typedef void (implA::*FuncA)(
          const std::shared_ptr<A>&,
          const std::function<void(void)>&);
    

    问题的关键是这个。使用不正确的typedef是否会影响智能指针的引用计数,以及是否可能在操作结束时耗尽内存。

    1 回复  |  直到 6 年前
        1
  •  0
  •   E. Musser    6 年前

    你已经进入了一个行为不明的世界。您的示例_funcA具有签名:

      void(const std::shared_ptr<A>&, const std::function<void(void)>&)
    

     void(const std::shared_ptr<A>&, std::function<void(void)>)
    

    在调用它之前。这使得编译器认为它需要复制第二个参数,因为它希望它通过值传递,而实际上示例_funcA需要常量引用。编译器设置(和复制)参数的方式与方法实际期望的不匹配可能会导致副本丢失,从而导致泄漏。当您将共享的\u ptr绑定到示例\u funcB时,绑定捕获了共享的\u ptr,而正是这个捕获导致了泄漏。

    正如已经有人评论的那样,您应该避免C样式转换,因为使用它们的编译器不会对您提供任何保护。喜欢静态演员阵容<&燃气轮机;或者在你能做到的地方不投。