c++ - 为什么 boost::bind with deleted object 有效?

标签 c++ boost memory-leaks boost-asio

看这段代码:

#include <asio.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>

#include <iostream>
using namespace std;

class acceptor
{
private:
    asio::ip::tcp::acceptor * a;
    asio::io_service &_service;
    asio::ip::tcp::endpoint ep;
public:
    acceptor(asio::io_service &service, unsigned int port)
        :_service(service), ep(asio::ip::tcp::v4(), port)
    {
        try {
            a = new asio::ip::tcp::acceptor(service, ep);
        }
        catch (asio::system_error &e) {
            cout << e.what() << endl;
        }
        continueAccept();
    }

    ~acceptor() {
        delete a;
        cout << " destroy " << endl;
    }

    void continueAccept() {
        cout << "start accepting ..." << endl;
        boost::shared_ptr<asio::ip::tcp::socket> ptr(new asio::ip::tcp::socket(_service));
        a->async_accept(*ptr, boost::bind(&acceptor::handleAccept, this, ptr, asio::placeholders::error));
    }

    void handleAccept(
        boost::shared_ptr<asio::ip::tcp::socket> &socket,
        const asio::error_code &e)
    {
        if (e == asio::error::operation_aborted) {
            cout << "handler is called by error_code : " << e.message() << endl;
        }
    }

    void close() {
        cout << "close is called ..." << endl;
        a->close();
    }
};

int main(int argc, char *argv[]) {
    asio::io_service service;
    acceptor *aa = new acceptor(service, 8899);

    service.poll();
    service.reset();

    delete aa;

    service.poll();
    service.reset();

    return 0;
}

输出是:

  • 开始接受...
  • 销毁
  • 处理程序由 error_code 调用:操作中止

当我在 main 方法中删除 aa 对象时,aa 对象的析构函数上的 asio::ip::tcp::acceptor 调用他的关闭,异步操作将调用 asio::error::operation_aborted。

现在,在删除后,在删除的对象上调用类似 acceptHandler 的方法不会导致崩溃 或内存使用不当,但这是预料之中的。当然,我用valgrind memory analyzer测试程序是否可能出错,但没有错误存在。

问题:为什么程序在通过boost调用已删除对象的函数时能正常运行?

最佳答案

why the program works currectly while calling a function on deleted object by boost?

因为这是未定义行为的工作方式之一。一旦你删除了一个对象,你就不应该访问它。如果这样做,您将调用一个 UB。

你很不幸,因为你的程序似乎可以工作。

关于c++ - 为什么 boost::bind with deleted object 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8988111/

相关文章:

c++ - 这个函数调用真的有歧义吗?

c++ - 从基类类型的指针数组调用派生类的方法。 (C++)

c++ - 无序多重映射查找所有值

c++ - boost spirit x3 : parse into structs

c++ - boost::asio 线程池与 io_service_per_cpu 设计

c++ - xmlReadMemory - 未知 'url' 参数

c++ - 如何通过 boost::iostream 防止 zip 炸弹

c++ - Qt 应用程序因内存不足 (OOM) 而终止

ios - Cocos2D/iOS7 : continuously increasing memory usage for boilerplate code

c++ - grpc server 不会释放内存,是内存泄漏了吗?