Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;/typedef的错误参数是否导致内存泄漏?_C++_Memory Leaks_Shared Ptr_Typedef - Fatal编程技术网

C++ C++;/typedef的错误参数是否导致内存泄漏?

C++ C++;/typedef的错误参数是否导致内存泄漏?,c++,memory-leaks,shared-ptr,typedef,C++,Memory Leaks,Shared Ptr,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>

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)
{...}
void示例\u funcA(
const std::共享对象,
const std::函数和下一步)
{
... 
next();
...
}
...
无效示例\u funcB(常数std::共享\u ptr&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));
auto implA_uu=std::使_共享(…);
typedef void(implA::*FuncB)(const std::shared_ptr&);
typedef std::function Func;
typedef void(implA::*FuncA)(
const std::shared_ptr&,
std::函数);
自动下一步=(Func)std::bind((FuncB)和implA::example_FuncB,implA_u2;,object);
implA_uu2;->异步(std::bind((FuncA)&implA::example_FuncA,implA_2;,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 void(implA::*FuncA)(
const std::shared_ptr&,
std::函数);
->修正码
typedef void(implA::*FuncA)(
const std::shared_ptr&,
常数std::函数&);
这段代码将类A的对象作为我们想要的智能指针删除


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

您已经进入了未定义行为的世界。您的示例_funcA具有签名:

  void(const std::shared_ptr<A>&, const std::function<void(void)>&)
void(const std::shared_ptr&,const std::function&)
但你的目标是:

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


正如已经有人评论的那样,您应该避免C样式转换,因为使用它们的编译器不会对您提供任何保护。尽可能选择静态或不强制转换。

发布一篇文章会改善问题。只需发布你认为有问题的程序。您不需要发布替代的、正确的代码。您不应该使用C样式转换,因为它们有许多实例在错误使用时会导致无提示的未定义行为。如果您需要强制转换(以消除重载函数的歧义),请使用
static\u cast
并确保您的示例是可逐字编译的。强制转换是程序员告诉编译器“闭嘴,我知道我在做什么”的方式。但是编译器有很多方法告诉程序员“没有朋友,你没有”。