huyutian

他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 47 文章 :: 22 评论 :: 0 Trackbacks
最近写一个程序时,出现了内存泄漏问题。然后到网上搜索了一下,发现了一个简单易用的开源内存泄漏检测工具Visual Leak Detector (VLD) ,在visual c++上工作的很好,其他环境尚未研究。源代码、安装文件可以从codeproject下载,目前最新版本是v1.9b。
先说说这个工具的使用。安装完毕,在需要调试的项目中加入把Visual Leak Detector 的Include目录和LIB目录添加到项目的路径中去。再在需要监视的cpp文件头中加入#include <vld.h>,如果是MFC程序,就可以直接在stdafx.h的最后面加上这一句。剩下的就是运行调试程序,在output窗口察看结果了。
我的错误信息如下。
---------- Block 251168 at 0x00FE9998: 16 bytes ----------
  Call Stack:
    c:\program files\microsoft visual studio .net 2003\vc7\include\xmemory (34): std::_Allocate<char>
    c:\program files\microsoft visual studio .net 2003\vc7\include\xmemory (137): std::allocator<char>::allocate
    c:\program files\microsoft visual studio .net 2003\vc7\include\xstring (1454): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy
    c:\program files\microsoft visual studio .net 2003\vc7\include\xstring (1485): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow
    c:\program files\microsoft visual studio .net 2003\vc7\include\xstring (612): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign
    c:\program files\microsoft visual studio .net 2003\vc7\include\xstring (623): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign
    c:\program files\microsoft visual studio .net 2003\vc7\include\xstring (473): std::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator=
    d:\projects\client\quoteclient\tradetransaction.cpp (2143): CTradeTransaction::AnsReadTodayOrder
    d:\projects\client\quoteclient\tradetransaction.cpp (2694): CTradeTransaction::ProcessAllReq
    d:\projects\client\quoteclient\tradesocket.cpp (93): CTradeSocket::ReceivePacket
    d:\projects\client\quoteclient\tradethread.cpp (146): CTradeThread::RunWorkerInternal
    d:\projects\client\quoteclient\tradethread.cpp (97): CTradeThread::WorkerThreadProc
    f:\vs70builds\3077\vc\crtbld\crt\src\threadex.c (241): _threadstartex
    0x7C80B729 (File and line number not available): GetModuleFileNameA
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
点击内存泄漏条目可以定位到某一行源代码,可以看出主要是使用std::string不当造成的内存泄漏。
进一步分析发现是由于对某个结构体的成员变量std::string误使用了memset初始化造成的。
struct tag_myStruct
{
std::string id;
int value;
}
总结一下,在c语言中,结构体的初始化,是可以直接memset(pStruct, 0,  sizeof(tag_myStruct));
但在c++中必须小心,比如上面的结构实际上就是一个类了,习惯性的用memset就会出错。为防止这种惯性思维,建议将所有复杂结构直接用class来申明.然后定义缺省构造函数。否则将来使用时一不小心,就可能造成不测。

补充:尽量不要在C++程序中使用C风格的代码。但这个是需要一些时间来调整的。
posted on 2010-01-26 14:57 胡雨田 阅读(1068) 评论(0)  编辑 收藏 引用 所属分类: 编程技巧

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理