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?就此功能而言,有没有办法在 returning 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之后你的数据类型然后下一条语句不起作用。编译器忽略它。