return 语句后函数可以继续吗?
Can a function continue after a return statement?
考虑以下 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
语句后继续 运行ning?就此功能而言,有没有办法在 return
ing loadedBMP
之后得到最后一行 SDL_FreeSurface(loadedBMP)
、运行?
不,因为在汇编级别,return 指令将控制权交还给调用者,因此它固有地退出范围。
除此之外,释放你正在 return 的 SDL_Surface
会给你留下一个无法使用的悬空表面,所以我看不出这样做的目的。
没有。但是,是的。在 return 语句之后不会执行函数的任何行。但是,return 语句也标志着函数的结束,因此也标志着作用域的结束。所以如果你设法在堆栈上有一个对象(比如局部变量),它的析构函数将被调用。
但这不是你想要的。你不想释放你 return 的东西,即使是在 return 声明之后。
您认为您想要的:在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;
}
它在 return 之后执行下一条语句,因为我在使用 C 语言的 postgres 中遇到了类似的情况,我发送了一个数据集然后我想在 returning 集之后删除所有记录.它对我来说很好。
为了澄清,请保留打印报表。
否。原因是在return之后值你的数据类型然后下一条语句不起作用。编译器忽略它。
考虑以下 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
语句后继续 运行ning?就此功能而言,有没有办法在 return
ing loadedBMP
之后得到最后一行 SDL_FreeSurface(loadedBMP)
、运行?
不,因为在汇编级别,return 指令将控制权交还给调用者,因此它固有地退出范围。
除此之外,释放你正在 return 的 SDL_Surface
会给你留下一个无法使用的悬空表面,所以我看不出这样做的目的。
没有。但是,是的。在 return 语句之后不会执行函数的任何行。但是,return 语句也标志着函数的结束,因此也标志着作用域的结束。所以如果你设法在堆栈上有一个对象(比如局部变量),它的析构函数将被调用。
但这不是你想要的。你不想释放你 return 的东西,即使是在 return 声明之后。
您认为您想要的:在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;
}
它在 return 之后执行下一条语句,因为我在使用 C 语言的 postgres 中遇到了类似的情况,我发送了一个数据集然后我想在 returning 集之后删除所有记录.它对我来说很好。
为了澄清,请保留打印报表。
否。原因是在return之后值你的数据类型然后下一条语句不起作用。编译器忽略它。