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++的任意操作系统相反,我的答案是正确的。