考虑以下C ++函数:
SDL_Surface* loadBMP(std::string path, SDL_Surface* loadedBMP){
//Load bitmap
SDL_Surface* loadedBMP = SDL_LoadBMP(path);
if (loadedBMP == NULL){
printf("Unable to load image %s! SDL Error: %s\n", path.c_str(), SDL_GetError());
}
return loadedBMP;
//Magic
SDL_FreeSurface(loadedBMP);
}
现在,为了这个问题,假设loadedBMP
是先前声明的全局变量。
这是我的问题:有没有办法让函数在return
语句后继续运行?就此功能而言,有没有办法让最后一行SDL_FreeSurface(loadedBMP)
在return
loadedBMP
之后运行?
答案 0 :(得分:7)
没有。但是,是的。 return语句后不会执行该函数的任何行。但是,return语句也标志着函数的结束,因此结束了范围。因此,如果您设法在堆栈上有一个对象(如局部变量),则会调用它的析构函数。
但那不是你想要的。你不想释放你的回报,即使在回复陈述之后也是如此。
答案 1 :(得分:5)
不,因为在汇编级别,返回指令会将控件返回给调用者,因此它本身就会退出范围。
除此之外,释放你正在返回的SDL_Surface
会让你留下一个无法使用的悬垂表面,所以我不明白这样做的目的。
答案 2 :(得分:1)
你想要的思考:在return语句之后运行代码。
您可能想要的内容:通过确保始终释放资源来防止内存泄漏。
为此,请使用std :: unique_ptr。大致(伪代码):
std::unique_ptr<SDL_Surface,SDL_FreeSurface> loadBMP(std::string path){
//Load bitmap
std::unique_ptr<SDL_Surface,SDL_FreeSurface> loadedBMP{SDL_LoadBMP(path)};
if (!loadedBMP){
printf("Unable to load image %s! SDL Error: %s\n", path.c_str(), SDL_GetError());
}
return loadedBMP;
}
答案 3 :(得分:0)
它在返回后执行下一条语句,因为我在postgres中遇到了类似C的情况,我发送了一个数据集,然后我想在返回该集后删除所有记录。对我来说很好。
为澄清起见,请保留打印语句。
答案 4 :(得分:-1)
否。原因是返回 值您的数据类型后, next语句不起作用。忽略它。