C++ / typedef参数错误导致内存泄漏?

C++ / Is the wrong parameter of typedef causing a memory leak?

是不是typedef参数错误导致内存泄露? 以下代码会造成内存泄漏

我们有 例子ClassA

implA.cpp

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)
{...}

implB.cpp / 我们一开始编码错误。 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));

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

但是我们修改了代码。

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

这段代码移除了classA的对象作为我们想要的智能指针。

问题的重点是这个。使用不正确的typedef是否会影响智能指针的引用计数,是否有可能在运行结束时运行 out of memory

您已经进入了未定义行为的世界。您的 example_funcA 有签名:

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

但您将其转换为:

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

在调用它之前。这使得编译器认为它需要复制第二个参数,因为它希望它按值传递,而实际上 example_funcA 需要 const 引用。编译器设置(和复制)参数的方式与方法实际期望的不匹配可能导致副本丢失,从而导致泄漏。当您将 shared_ptr 绑定到 example_funcB 时,绑定会捕获 shared_ptr 并且正是此捕获特别泄漏。

正如有人已经评论过的那样,您应该避免使用 C 样式转换,因为使用它们的编译器不会保护您。尽可能选择 static_cast<> 或不强制转换。