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

时间:2015-02-05 19:20:32

标签: c++ function return sdl

考虑以下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之后运行?

5 个答案:

答案 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语句不起作用。忽略它。