函数能否在返回语句后继续

Can a function continue after a return statement?

本文关键字:语句 继续 返回 函数      更新时间:2023-10-16

考虑以下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: %sn", path.c_str(), SDL_GetError());
    }
    return loadedBMP;
    
    //Magic
    SDL_FreeSurface(loadedBMP);
}

现在,为了这个问题,假设loadedBMP是先前声明的全局变量。

这是我的问题:
有没有办法让函数在return语句之后继续运行?就这个函数而言,有没有办法让最后一行SDL_FreeSurface(loadedBMP)returnloadedBMP之后运行?

否。但是是的。在返回语句之后,将不会执行函数的任何行。然而,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: %sn", path.c_str(), SDL_GetError());
    }
    return loadedBMP;
}

它在返回后执行下一个语句,因为我在使用C语言的postgres中遇到过类似的情况,我发送了一个数据集,然后我想在返回集后删除所有记录。它对我来说很好。

为了澄清,请打印报表。

。原因是在返回后,您的数据类型然后下一个语句不起作用。编译器忽略它。