首页 > 解决方案 > 是一个“包罗万象”的块,它释放动态分配的内存,然后重新抛出一个有效/好的设计选择?

问题描述

我通常使用现代 C++ 的功能,如智能指针,很少使用原始指针作为动态分配对象的处理程序。因此,我在解除分配方面没有太多经验。我想知道以下代码示例是否是防止异常引起的内存泄漏的有效设计选择:

void HttpListener::spawnRequestHandler(const http_request& request) {
    std::thread handlerThread([request](){
        IRequestHandler* handler = new HttpRequestHandler(request);
        try {
            handler->handleRequest();
        }
        catch (...){
            delete handler;
            std::rethrow_exception(std::current_exception());
        }
    });
    handlerThread.detach();
}

标签: c++exception

解决方案


这里已经是一个很好的答案

但是,代码似乎还有更多问题。应该在哪里清理请求处理程序原始指针?

也许它被http_request(不太可能)拥有或在内部删除自身handleRequest()(也不太可能),我们无法从示例中看到这一点(但两者都是不好的做法)。它看起来像内存泄漏。

也不需要显式使用接口IRequestHandler

总而言之,代码(在线程中)可能会简化为:

HttpRequestHandler handler(request);
handler.handleRequest();

此外,您不需要指向基类的指针,您也可以使用引用:

IRequestHandler& handlerInterface = handler;

推荐阅读