c++ - 是 “catch all” block ,它会动态分配分配的内存,然后重新抛出有效/良好的设计选择?

标签 c++ exception

我通常利用现代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++是极少数具有RAII概念的语言之一,RAII是为执行异常安全代码而创建的。
简而言之,在您进行调用时,它获取/创建了它自己的构造函数,并在它的析构函数中进行清理。str::unique_ptrstd::scoped_lock是很好的例子。但是,如果您有多个return语句,这也非常有用。
在这种情况下,我将代码修改为:

void HttpListener::spawnRequestHandler(const http_request& request) {
    std::thread handlerThread([request](){
        auto handler = std::make_unique<HttpRequestHandler>(request);
        handler->handleRequest();
        handler.release();
    });
handlerThread.detach();
}
如您所见,该代码较小,更易于阅读。通过发行版,您可以在所有操作正确结束后停止删除。不确定原始代码中的内容是否很大。虽然,如果有意,这使它变得明确,这以后更容易调试。
如果您需要破坏时需要执行的其他操作,scope guard可能会非常有用。但是,不确定该链接,基于Andrei Alexandrescu的演示文稿具有您可以想象的所有功能。
注意:如果不需要发行版,则可以在堆栈上创建实例。

关于c++ - 是 “catch all” block ,它会动态分配分配的内存,然后重新抛出有效/良好的设计选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588433/

相关文章:

c++ - 可移植 ntohl 和 friend

c++ - 你如何清除一个 std::ostringstream 实例以便它可以被重用?

c++ - 什么是 `R(*pf)(void*, Args...)` ,指向方法的函数指针?

c++ - SQLite DB(带 WAL)在准备 "select"statmement 时被锁定 - 为什么?

c# - 发送带有操作结果的消息

windows - 使用WinDbg调试0xc000001d异常

c# - 在 UWP 应用程序中处理 Dispatcher 异常

c++ - 是否可以在 Go 中使用类似 "freopen"的结构?

java - 在这种情况下如何处理错误?通过异常或 boolean 值或其他

c++ - 如何检测异常何时发生?