C++ 在类中运行析构函数时退出程序
我试图在调用对象的析构函数时结束程序。它的部分工作方式,因为对象已删除,但程序仍在运行。有没有办法做到这一点?或者这是一个错误的方法,用更好的方法来做这件事?谢谢你的帮助!非常感谢 这里是主要功能C++ 在类中运行析构函数时退出程序,c++,sdl,C++,Sdl,我试图在调用对象的析构函数时结束程序。它的部分工作方式,因为对象已删除,但程序仍在运行。有没有办法做到这一点?或者这是一个错误的方法,用更好的方法来做这件事?谢谢你的帮助!非常感谢 这里是主要功能 #include "engine.h" int main(int argc, char* argv[]) { bool running = true; Engine engine; engine.init(); while(running == true) {
#include "engine.h"
int main(int argc, char* argv[]) {
bool running = true;
Engine engine;
engine.init();
while(running == true) {
engine.update();
engine.render();
}
return 0;
}
这是对象。cpp
#include "engine.h"
Engine::Engine() {
}
void Engine::init() {
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_CreateWindow("Engine", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 960, 540, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);
if(screen == NULL) {
std::cout << "Could not create window: " << SDL_GetError() << std::endl;
}
}
void Engine::update(){
SDL_PollEvent(&event);
if(event.type == SDL_QUIT) {
delete this;
}
}
void Engine::render() {
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
Engine::~Engine() {
SDL_Quit();
}
#包括“engine.h”
引擎::引擎(){
}
void引擎::init(){
SDL_Init(SDL_Init_视频);
屏幕=SDL_CreateWindow(“引擎”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,960,540,显示SDL_WINDOW_);
渲染器=SDL\u CreateRenderer(屏幕,-1,SDL\u渲染器\u加速);
如果(屏幕==NULL){
std::cout如果要在调用引擎
析构函数时结束程序,可以使用exit();
请快速查看以获取更多信息。使用异常可能是从深度嵌套代码中退出的最优雅的方式,因为它可以确保堆栈被展开,所有内容都被正确销毁。我将定义一个空类型,仅为该异常抛出,可能嵌套在引擎中
:
class Engine {
public:
// ...
struct ExitException {};
// ...
};
然后将其从Engine::update
中抛出以退出:
void Engine::update(){
SDL_PollEvent(&event);
if(event.type == SDL_QUIT) {
throw ExitException();
}
}
您可以在main
中捕捉到它以干净地退出:
int main() {
Engine engine;
engine.init();
try {
while(true) {
engine.update();
engine.render();
}
} catch(Engine::ExitException&) {}
}
我对SDL一无所知,但它是否正在创建一些不会停止的线程?@kmort right我正在尝试查看当对象被销毁时是否有办法结束程序,因为没有游戏对象,你就没有游戏了Lol你是说当调用引擎
析构函数时,你想退出程序吗?如果是,你可以只需使用exit()
@kmort这正是我在阅读您的评论之前所做的。如果您想将其作为答案,我将接受:)删除此
在此
指向未分配新
的对象时有未定义的行为,就像您的程序一样。因为这似乎是在执行窗口管理ent,调用exit()
可能是个坏主意。可能需要运行本地析构函数,并调用旧的C库清理函数。