c++ - 为什么我的shared_ptr会泄漏内存?

标签 c++ c c++11 sdl

我正在尝试使用 C++11 的 std::tr1::shared_ptr 来管理 SDL_Surface 指针。请注意,我没有使用 Boost。我已经为shared_ptr定义了一个删除器以使用SDL_FreeSurface。

声明如下:

class Engine {
private:
  std::tr1::shared_ptr<SDL_Surface> _scr;
  std::tr1::shared_ptr<SDL_Surface> _bg;  

定义(在引擎的构造函数中)如下:

_scr = std::tr1::shared_ptr<SDL_Surface>( SDL_SetVideoMode(Data::SCR_WIDTH,
                                                          Data::SCR_HEIGHT,
                                                        32, SDL_SWSURFACE),
                                            SurfaceDeleter<SDL_Surface>());

  _bg = std::tr1::shared_ptr<SDL_Surface>(IMG_Load(Data::IM_BACKGROUND),
                                         SurfaceDeleter<SDL_Surface>());

自定义删除器:

template<typename T>
class SurfaceDeleter{ 
public:
  void operator() (T*& d) const {
    if(d){
      SDL_FreeSurface(d);
    }
  }
};

唯一持有shared_ptr的对象是引擎。 Shared_ptr 的使用方式如下:

  SDL_BlitSurface(_bg.get(), nullptr, _scr.get(), nullptr);
  SDL_Flip(_scr.get());

Valgrind 结果:

==3648== 8 bytes in 2 blocks are definitely lost in loss record 16 of 292
==3648==    at 0x402A018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3648==    by 0x431FBE0: strdup (in /lib/libc-2.14.1.so)

==3648== 1 bytes in 1 blocks are definitely lost in loss record 1 of 292
==3648==    at 0x402A018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3648==    by 0x494A590: _XlcDefaultMapModifiers (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x494A99A: XSetLocaleModifiers (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x4097CDB: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==3648==    by 0x4083868: SDL_VideoInit (in /usr/lib/libSDL-1.2.so.0.11.3)
==3648==    by 0x40594D9: SDL_InitSubSystem (in /usr/lib/libSDL-1.2.so.0.11.3)
==3648==    by 0x42C3212: (below main) (in /lib/libc-2.14.1.so)

==3648== 980 (68 direct, 912 indirect) bytes in 1 blocks are definitely lost in loss record 258 of 292
==3648==    at 0x402A102: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3648==    by 0x49402A6: ??? (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x49407A2: ??? (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x494212F: ??? (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x49429BA: _XlcCreateLC (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x4965957: _XlcUtf8Loader (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x494A793: _XOpenLC (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x494A8F1: _XlcCurrentLC (in /usr/lib/libX11.so.6.3.0)
==3648==    by 0x4097CDB: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==3648==    by 0x4083868: SDL_VideoInit (in /usr/lib/libSDL-1.2.so.0.11.3)
==3648==    by 0x40594D9: SDL_InitSubSystem (in /usr/lib/libSDL-1.2.so.0.11.3)
==3648==    by 0x42C3212: (below main) (in /lib/libc-2.14.1.so)

最佳答案

使用 --track-origins=yes 运行 valgrind,以便它显示泄漏内存的分配位置。

您可能还想使用 --leak-check=full--leak-resolution=high (尽管后者应该是默认值)

关于c++ - 为什么我的shared_ptr会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686348/

相关文章:

c - 如何使用双指针插入单向链表?

c - 传递数组地址

c++ - CustomDialogEx 的 shared_ptr 或 unique_ptr

线程拼图中的c++ 11仿函数

c++ - 这有什么问题?

c++ - 为什么即使我通过引用传递,变量的值也没有变化

c++ - 调用成员函数集到特定变体的正确 C++ 变体语法是什么?

c++ - C 或 C++ 中的多态引擎

c++ - 组成 std​​::integral_constant 值

C++ | LNK1104 - 无法打开文件 kernel32.lib