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

问题描述 投票:-1回答:5

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

c++ function return sdl
5个回答
7
投票

不,但是。 return语句后不会执行该函数的任何行。但是,return语句也标志着函数的结束,因此结束了范围。因此,如果您设法在堆栈上有一个对象(如局部变量),则会调用它的析构函数。

但那不是你想要的。您不想释放您返回的内容,即使在返回语句之后也是如此。


5
投票

不,因为在汇编级别,返回指令会将控件返回给调用者,因此它本身就会退出范围。

除此之外,释放你正在返回的SDL_Surface会留下一个悬垂的表面,这是无法使用的,所以我没有看到这样做的目的。


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;
}

0
投票

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

对于澄清,请保留打印声明。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.