c++ - 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 是否会影响智能指针的引用计数,以及是否有可能在操作结束时耗尽内存。
解决方案
你已经进入了未定义行为的世界。您的 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<> 或不进行强制转换。
推荐阅读
- javascript - 获取 flexbox 定位元素的左侧和顶部
- android - 带有 Crosswalk 的 Ionic 应用程序编译、安装但无法打开
- r - 基于多个变量过滤数据
- c - 查找字符串中数字(0-9)的频率
- actionscript-3 - Nape Physics:碰撞问题(跨瓷砖移动)
- python - python os.path.exists 返回 false
- ruby-on-rails - 如何解析has_many关联before_save
- python-2.7 - Jython 2.7.1 + ftfy 4.4
- excel - 如何将范围数据导入 VBA?
- wpf - WPF 可重用标签和文本框行