gpt4 book ai didi

C++/typedef参数错误导致内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:53 24 4
gpt4 key购买 nike

是不是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 是否会影响智能指针的引用计数,以及是否有可能在操作结束时耗尽内存。

最佳答案

您已经进入了未定义行为的世界。你的 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 绑定(bind)到 example_funcB 时,绑定(bind)会捕获 shared_ptr,而正是此捕获导致了泄漏。

正如有人已经评论过的那样,您应该避免使用 C 样式转换,因为使用它们的编译器不会保护您。尽量选择 static_cast<> 或不强制转换。

关于C++/typedef参数错误导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53367506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com