Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回指向同一变量的指针是否会泄漏内存?_C++_Pointers_Memory_Sdl_Sdl 2 - Fatal编程技术网

C++ 返回指向同一变量的指针是否会泄漏内存?

C++ 返回指向同一变量的指针是否会泄漏内存?,c++,pointers,memory,sdl,sdl-2,C++,Pointers,Memory,Sdl,Sdl 2,这个代码会泄漏内存吗 SDL_Texture* texture; SDL_Surface* surface; int infinity = 99999999; for (int i=0; i<infinity; i++) { surface = IMG_Load("path/to/image.png"); texture = SDL_CreateTextureFromSurface(renderer, surface); } 我是否需要在重新分配变量之前每次都清除内存中的表面

这个代码会泄漏内存吗

SDL_Texture* texture;
SDL_Surface* surface;
int infinity = 99999999;
for (int i=0; i<infinity; i++) {
   surface = IMG_Load("path/to/image.png");
   texture = SDL_CreateTextureFromSurface(renderer, surface);
}
<>我是否需要在重新分配变量之前每次都清除内存中的表面和纹理?

< p>唯一导致C++内存泄漏的唯一原因是一个新的与删除或新的[]不平衡的新的[]与删除[]不平衡。此外,如果您使用malloc&c,那么您必须使用free

在您的例子中,看起来IMG_Load和SDL_CreateTextureFromSurface确实分配了内存,所以是的,我认为它确实泄漏了内存。请参阅函数文档,了解您需要如何管理任何已分配内存的释放。通常,如果库分配内存,那么它会提供一种释放内存的方法。这是因为内存管理是由C++运行时完成的,并且可以从编译到编译。

唯一导致C++内存泄漏的是一个与删除或新的[]不平衡的新的[]与Dele[]。此外,如果您使用malloc&c,那么您必须使用free

在您的例子中,看起来IMG_Load和SDL_CreateTextureFromSurface确实分配了内存,所以是的,我认为它确实泄漏了内存。请参阅函数文档,了解您需要如何管理任何已分配内存的释放。通常,如果库分配内存,那么它会提供一种释放内存的方法。这是因为内存管理是由C++运行时完成的,并且可以从编译到编译都有不同。

< P>是的。具有必须调用的相应的和方法

SDL_CreateTextureFromSurface页面上的注释

此函数不会修改或释放曲面

根据@bathsheba,可以使用std::unique_ptr进行删除

auto SDLTextureDeleter = [](SDL_Texture* pTexture) { if(pTexture) SDL_DestroyTexture(pTexture); };
std::unique_ptr<SDL_Texture, decltype(SDLTextureDelter)>(texture, SDLTextureDeleter); // This will call SDL_DestroyTexture when the unique pointer is destructed.
为了获得额外的积分,您可以在命名空间std中为std::default_delete添加专门化,以处理SDL****指针,并避免单独声明删除程序。

是。具有必须调用的相应的和方法

SDL_CreateTextureFromSurface页面上的注释

此函数不会修改或释放曲面

根据@bathsheba,可以使用std::unique_ptr进行删除

auto SDLTextureDeleter = [](SDL_Texture* pTexture) { if(pTexture) SDL_DestroyTexture(pTexture); };
std::unique_ptr<SDL_Texture, decltype(SDLTextureDelter)>(texture, SDLTextureDeleter); // This will call SDL_DestroyTexture when the unique pointer is destructed.

为了获得额外的积分,您可以在命名空间std中为std::default_delete添加专门化,以处理SDL****指针,并避免单独声明删除程序。

是。您应该使用SDL_FreeSurface函数释放内存

在这种情况下,我建议使用智能指针“自动”释放内存:

std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> surface{IMG_Load(path.c_str()), SDL_FreeSurface};

对。您应该使用SDL_FreeSurface函数释放内存

在这种情况下,我建议使用智能指针“自动”释放内存:

std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> surface{IMG_Load(path.c_str()), SDL_FreeSurface};

如果您向OP演示如何使用自定义删除程序将其连接到std::unique_ptr,那么我将对此进行大量更新。可能需要注意的是,在完成操作后,文档中明确声明不要忘记将SDL_释放返回的曲面指针。根据@Bathsheba的评论,您可以创建一个std::unique_ptr来处理销毁,只需很少的代码。对于IMG_Load和SDL_FreeSurface函数,可以执行以下操作:std::unique_ptr surface{IMG_Loadpath/to/image.png,SDL_FreeSurface}@jaggedSpire很高兴知道如果您向OP展示如何使用自定义删除程序将其连接到std::unique_ptr,那么我将对此进行大量更新。可能需要注意的是,文档中明确声明,在完成操作后,不要忘记SDL_释放返回的曲面指针。根据@Bathsheba的评论,您可以创建一个std::unique_ptr来处理销毁,只需很少的代码。对于IMG_Load和SDL_FreeSurface函数,可以执行以下操作:std::unique_ptr surface{IMG_Loadpath/to/image.png,SDL_FreeSurface}@jaggedSpire很高兴知道是的,你应该,记住进行空指针检查。是的,你应该,记住进行空指针检查。不是真的。还有其他分配和泄漏内存的方法。示例包括UNIX上的brk/sbrk和Windows上的CoTaskMemAlloc、GlobalAlloc、HeapAlloc、LocalAlloc和VirtualAlloc。如果你有创意的话,情况会更糟。可以说,这些都是平台特定的,但它们确实证明了有其他方法来分配/泄漏。在标准C++环境下,与提供C++ C++的任意操作系统相反,我的答案是正确的。还有其他分配和泄漏内存的方法。示例包括UNIX上的brk/sbrk和Windows上的CoTaskMemAlloc、GlobalAlloc、HeapAlloc、LocalAlloc和VirtualAlloc。如果你有创意的话,情况会更糟。可以说,这些都是平台特定的,但它们确实证明了有其他方法来分配/泄漏。在标准C++环境下,与提供C++ C++的任意操作系统相反,我的答案是正确的。