Linux下内存检查

turbocamel 2009-12-01 02:32:10
STL的一个好处就是省去自己管理内存的麻烦,但是我发现在Windows上用boundChecker检查内存时,总是会跟踪到stl的函数内部。最近在Linux下使用valgrind检查内存泄露又碰到这类问题。
比如:
23,416 bytes in 1 blocks are possibly lost in loss record 23 of 33
at 0x401AFE7: operator new(unsigned int) (vg_replace_malloc.c:214)
by 0x419F830: std::__default_alloc_template<true, 0>::_S_chunk_alloc(unsigned int, int&)
by 0x419F73C: std::__default_alloc_template<true, 0>::_S_refill(unsigned int) (in /usr/lib/libstdc++.so.5.0.3)
by 0x419F2AB: std::__default_alloc_template<true, 0>::allocate(unsigned int) (in /usr/lib/libstdc++.so.5.0.3)
by 0x41A52A7: std::string::_Rep::_S_create(unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.5.0.3)
by 0x41A53D8: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.5.0.3)
by 0x41A3145: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.5.0.3)
by 0x41A36EB: std::string::append(unsigned int, char) (in /usr/lib/libstdc++.so.5.0.3)
by 0x41A33DE: std::string::operator+=(char) (in /usr/lib/libstdc++.so.5.0.3)
by 0x407C723: CMyclass::mymethod(std::istream&) (in /home/lzq/lib/libmylib.so)
最终的指向是std::__default_alloc_template<true, 0>::_S_chunk_alloc(unsigned int, int&) 函数当中调用new,最后又没有释放内存。
我不太了解的是这些内存泄露是否是真正的内存泄露。
如果不是内存泄露那么程序退出都没有释放内存,该什么时候释放?
...全文
265 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
turbocamel 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yshuise 的回复:]
引用 7 楼 turbocamel 的回复:
引用 3 楼 jackyjkchen 的回复:
引用 2 楼 turbocamel 的回复:
  比如说我在一个函数内部throw,那么在这个方法内的stl对象就有可能没有被析构?

  函数没有结束,对象还在生存期内

我现在的程序运行正常,除了我自己会抛出异常之外,没有catch到其他的异常。
在类当中对于成员在析构的时候该删除的都删除了,所有的new都有对应的delete。

另外,假如在函数内部throw之前我
std::string s = "11111";
然后
throw;
这也会有问题吗,s在跳出函数的时候就应该执行析构函数,不会有内存泄露啊。

析构函数不允许抛出异常,这是国际惯例。

[/Quote]
没有在析构函数当中抛出异常,打死我也不敢。
我的意思是throw执行之后会跳出当前函数,那么因为s是函数内定义的临时变量,跳出该函数之后会自动调用该std::string的析构,所以不应该存在内存泄露的问题。
老邓 2009-12-01
  • 打赏
  • 举报
回复
调用new的是一个static全局变量吗?
这些内存泄露检测工具基本上都是检查是否配对。
如果是static对象,有可能在程序过程是最后一个析构的。
那靠软件是检测不准确的。
yshuise 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 turbocamel 的回复:]
引用 3 楼 jackyjkchen 的回复:
引用 2 楼 turbocamel 的回复:
比如说我在一个函数内部throw,那么在这个方法内的stl对象就有可能没有被析构?

函数没有结束,对象还在生存期内

我现在的程序运行正常,除了我自己会抛出异常之外,没有catch到其他的异常。
在类当中对于成员在析构的时候该删除的都删除了,所有的new都有对应的delete。

另外,假如在函数内部throw之前我
std::string s = "11111";
然后
throw;
这也会有问题吗,s在跳出函数的时候就应该执行析构函数,不会有内存泄露啊。
[/Quote]
析构函数不允许抛出异常,这是国际惯例。
turbocamel 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jackyjkchen 的回复:]
引用 2 楼 turbocamel 的回复:
比如说我在一个函数内部throw,那么在这个方法内的stl对象就有可能没有被析构?

函数没有结束,对象还在生存期内
[/Quote]
我现在的程序运行正常,除了我自己会抛出异常之外,没有catch到其他的异常。
在类当中对于成员在析构的时候该删除的都删除了,所有的new都有对应的delete。

另外,假如在函数内部throw之前我
std::string s = "11111";
然后
throw;
这也会有问题吗,s在跳出函数的时候就应该执行析构函数,不会有内存泄露啊。
老邓 2009-12-01
  • 打赏
  • 举报
回复
boundChecker误报是常有的事。
我现在根本不信任boundChecker.
我最后打实现的检测内存方式,楼主如果有兴趣,去看看(27楼):http://topic.csdn.net/u/20091130/21/ade5e4d0-c976-44d0-aeec-b5353aeb9cd2.html
cattycat 2009-12-01
  • 打赏
  • 举报
回复
强烈同意jackyjkchen,如果程序当了,内存没释放,肯定会扑捉到stl里边去。这些对象在析构的时候会被释放内存。stl里的allocator就是做这个工作的。当你定义的vector等容器结束生命期,会自动析构,会释放内存。
pady_pady 2009-12-01
  • 打赏
  • 举报
回复
没有析构,要你自己在try catch中delete
jackyjkchen 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 turbocamel 的回复:]
比如说我在一个函数内部throw,那么在这个方法内的stl对象就有可能没有被析构?
[/Quote]
函数没有结束,对象还在生存期内
turbocamel 2009-12-01
  • 打赏
  • 举报
回复
比如说我在一个函数内部throw,那么在这个方法内的stl对象就有可能没有被析构?
jackyjkchen 2009-12-01
  • 打赏
  • 举报
回复
当你因为意外中断程序时,确实可能跟到stl内部

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧