C++ C++;/typedef的错误参数是否导致内存泄漏?
typedef的错误参数是否导致内存泄漏? 下面的代码创建内存泄漏 我们有 A类示例 implA.cppC++ 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>
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
并确保您的示例是可逐字编译的。强制转换是程序员告诉编译器“闭嘴,我知道我在做什么”的方式。但是编译器有很多方法告诉程序员“没有朋友,你没有”。