【发布时间】:2020-06-27 17:06:17
【问题描述】:
在使用 SDL 时,我一直在处理错误(例如在 SDL 初始化期间),只要在函数中遇到错误时返回 false,否则返回 true。然后通过在main() 函数的最后调用close() 函数来执行清理,如下所示:
int main(){
if(!init()){
// do some stuff
}
...
close();
return 0;
}
close()函数:
void close(){
SDL_DestroyRenderer(g_Renderer);
SDL_DestroyWindow(g_Window);
IMG_Quit();
SDL_Quit();
}
但是,我意识到这种清理方法意味着我不能真正抛出异常,因为不会调用 close() 函数。
在做了一些阅读之后,我决定尽量不抛出异常,除非需要,出于性能相关的原因(我听说这很重要,尤其是在游戏开发中)。
另外,这意味着随着程序的增长,我需要添加更多功能来清理close(),这似乎不切实际且容易忘记。
所以我的问题是:
- 一般来说,在使用 SDL 时我们应该在什么时候引发异常?除非需要,否则通常避免使用它们是否被认为是一种好的做法?
- 为了允许使用异常,应该如何清理 SDL 资源?我查看了一些方法,但我不确定何时使用每种方法,或组合每种方法:
- 创建一个 C++ 包装类来处理构造函数中的初始化和析构函数中的清理
- 通过正常初始化 SDL 对象来使用
unique_ptr(或其他智能指针)并提供删除器类进行清理。 - 使用
atexit()处理SDL_Quit()和IMG_Quit()?
我正在考虑实现一个包装类,但后来意识到我可能需要抛出异常以防初始化期间出现错误,例如来自SDL_CreateWindow(),我试图避免。有什么帮助或建议吗?
【问题讨论】:
-
您的进程即将消失 - 何必呢?内核对象/句柄将作为进程终止的一部分关闭。还剩下什么?
标签: c++ error-handling sdl code-cleanup