为什么在这种情况下会调用 double free?

Why is double free called in this situation?

我遇到了以下情况,幸运的是,我通过重构一些其他代码解决了这些问题,这与我在下面设法捕获的实际问题无关。

代码:

#include <boost/asio.hpp>

void passIocPtr(__attribute__((unused)) std::shared_ptr<boost::asio::io_context> iocPtr)
{}

void makeptr(boost::asio::io_context* ioc)
{
    std::shared_ptr<boost::asio::io_context> iocPtr = std::make_shared<boost::asio::io_context>();
    iocPtr.reset(ioc);
    passIocPtr(iocPtr);
}

void makeptr2(boost::asio::io_context* ioc)
{
    std::shared_ptr<boost::asio::io_context> iocPtr(ioc);
    passIocPtr(iocPtr);
}

int main()
{
    boost::asio::io_context ioc;
    // makeptr(ioc);
    makeptr2(ioc);
}

两个函数(makeptrmakeptr2)将导致:

double free or corruption (out) / free(): 无效指针

我正在处理的代码必须使用指向 io_context 的指针。 不完全确定我遇到的问题是否与 ioc 具体相关,我认为这几乎是我对智能指针的错误使用。

也许有人可以告诉我一些关于我应该如何更好地处理这个问题的见解。

shared_ptr专用于管理堆对象

此处:

int main()
{
    boost::asio::io_context ioc;
 //    makeptr(ioc);
    makeptr2(ioc);
}

您正在将堆栈对象传递给 shared_ptr(最终在 make_ptr2 中)。在那之后所有的赌注都被取消了。双重免费消息的真正意思是'whoa - you have trashed your heap'

如果你想让它工作,把 ioc 放在堆上

int main()
{
    boost::asio::io_context *ioc = new boost::asio::io_context;
    // makeptr(ioc);
    makeptr2(ioc);
}