Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/165.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++ 为什么我的共享\u ptr内存泄漏?_C++_C_C++11_Sdl - Fatal编程技术网

C++ 为什么我的共享\u ptr内存泄漏?

C++ 为什么我的共享\u ptr内存泄漏?,c++,c,c++11,sdl,C++,C,C++11,Sdl,我试图使用C++11的std::tr1::shared_ptr来管理SDL_曲面指针。注意,我没有使用Boost。我已经为共享的ptr定义了一个deleter来使用SDL_FreeSurface 声明如下: class Engine { private: std::tr1::shared_ptr<SDL_Surface> _scr; std::tr1::shared_ptr<SDL_Surface> _bg; Valgrind结果: ==3648== 8 b

我试图使用C++11的std::tr1::shared_ptr来管理SDL_曲面指针。注意,我没有使用Boost。我已经为共享的ptr定义了一个deleter来使用SDL_FreeSurface

声明如下:

class Engine {
private:
  std::tr1::shared_ptr<SDL_Surface> _scr;
  std::tr1::shared_ptr<SDL_Surface> _bg;  
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
(尽管后者应该是默认值)

不要在
SDL\u SetVideoMode
返回的指针上调用
SDL\u FreeSurface
。当您调用
SDL\u Quit
时,它将被释放。请参阅“返回值”下的内容。这还远远不够。我们需要了解如何使用共享指针。什么对象持有它们,什么对象控制它们,等等。同样,在C++11中没有像
std::tr1::shared\u ptr
这样的东西;它只是std::shared_ptr;TR1早于C++11,如果您使用的是C++11,则不应使用它。@Google:我没有试图回答您关于内存泄漏的问题。我只是告诉你,你的删除者在那种情况下是无效的。另外,如果删除了删除器,这意味着它将使用默认的删除器,这实际上只是对指针调用
delete
,这也是不应该的。C++11中的共享指针只是
std::shared\u ptr
,not
std::tr1::Sharedptr
Valgrind可能会对泄漏的数据给出一些误报,因为在应用程序退出时它仍然被分配,但它只分配一次,而且永远不会增长。如果你看实际字节数(989字节),它几乎不足以成为一个表面或任何重要的数据结构。可能是一些内部SDL状态变量
template<typename T>
class SurfaceDeleter{ 
public:
  void operator() (T*& d) const {
    if(d){
      SDL_FreeSurface(d);
    }
  }
};
  SDL_BlitSurface(_bg.get(), nullptr, _scr.get(), nullptr);
  SDL_Flip(_scr.get());
==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)