【问题标题】:C++ / Is the wrong parameter of typedef causing a memory leak?C ++ / typedef的错误参数是否导致内存泄漏?
【发布时间】:2019-04-21 09:24:48
【问题描述】:

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

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

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

【问题讨论】:

  • 发布MCVE 会改善问题。只需发布您认为有问题的程序即可。您不需要发布替代的正确代码
  • 您不应该使用 C 风格的强制转换,因为它们有很多在使用不当时会导致静默未定义行为的实例。如果您需要在那里进行强制转换(以消除重载函数的歧义),请使用 static_cast
  • 还要确保您的示例是可编译的verbatim
  • 演员表是程序员告诉编译器“闭嘴,我知道我在做什么”的方式。但是编译器有很多方法可以告诉程序员“朋友,你不要”。

标签: c++ memory-leaks shared-ptr typedef


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2019-10-21
    • 2016-03-14
    相关资源
    最近更新 更多