考虑以下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
ing loadedBMP
之后运行?
不,但是。 return语句后不会执行该函数的任何行。但是,return语句也标志着函数的结束,因此结束了范围。因此,如果您设法在堆栈上有一个对象(如局部变量),则会调用它的析构函数。
但那不是你想要的。您不想释放您返回的内容,即使在返回语句之后也是如此。
不,因为在汇编级别,返回指令会将控件返回给调用者,因此它本身就会退出范围。
除此之外,释放你正在返回的SDL_Surface
会留下一个悬垂的表面,这是无法使用的,所以我没有看到这样做的目的。
你认为你想要什么:在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;
}
它在返回后执行下一个语句,因为我在postgres中遇到类似的情况,语言为C,我发送了一个数据集然后我想在返回集合后删除所有记录。它对我来说很好。
对于澄清,请保留打印声明。
不是。原因是在返回值后你的数据类型然后下一个语句不起作用。编译器忽略它。