【发布时间】: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