首页 > 解决方案 > C ++ / typedef的错误参数是否导致内存泄漏?

问题描述

typedef 的错误参数是否会导致内存泄漏?以下代码创建内存泄漏

我们有 示例 A 类

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 / 我们一开始编码错误。类型定义函数

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

此代码将 A 类的对象作为我们想要的智能指针移除。

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

标签: c++memory-leaksshared-ptrtypedef

解决方案


你已经进入了未定义行为的世界。您的 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<> 或不进行强制转换。


推荐阅读