c++ - 是一个“包罗万象”的块,它释放动态分配的内存,然后重新抛出一个有效/好的设计选择?
问题描述
我通常使用现代 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();
}
解决方案
这里已经是一个很好的答案。
但是,代码似乎还有更多问题。应该在哪里清理请求处理程序原始指针?
也许它被http_request
(不太可能)拥有或在内部删除自身handleRequest()
(也不太可能),我们无法从示例中看到这一点(但两者都是不好的做法)。它看起来像内存泄漏。
也不需要显式使用接口IRequestHandler
。
总而言之,代码(在线程中)可能会简化为:
HttpRequestHandler handler(request);
handler.handleRequest();
此外,您不需要指向基类的指针,您也可以使用引用:
IRequestHandler& handlerInterface = handler;
推荐阅读
- javascript - 使用 [filter, map, some, reduce etc] 从二维数组的子对象创建一维数组
- java - 使用 android 中的改造在数组中发布数据
- java - 无法通过改造 2 获得响应消息
- python - 如何转换熊猫数据框
- ios - RxSwift - 如何具有可读的 combineLatest 事件元素变量名称?
- c# - 如何在 QRCoder C# 库中解码 qr 文件的文本?
- postgresql - 为什么磁盘空间问题会破坏 pg_statistic 表
- python - python 2.7不向nginx发送主机头
- r - 将“*”移动到 R 中的新列
- javascript - 在html5画布的矩形内对齐文本