Visual Studio 2010 STL的一个bug导致内存泄露

aflyinghorse 2010-12-23 09:58:32
这是我写的一篇文章,关于VS2010 STL可能内存泄露,欢迎各位发表评论,谢谢。
http://blog.csdn.net/aflyinghorse
...全文
280 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
aflyinghorse 2010-12-23
  • 打赏
  • 举报
回复
healer_kx:

我对你有印象,我记得多年前在学校时,我经常在csdn的C++版里泡着,那时经常能看到你很活跃的回答各种问题,后来我参加工作就没什么时间来这里了,没想到现在看到你已经两颗星了,厉害。
healer_kx 2010-12-23
  • 打赏
  • 举报
回复
我暂时就不用VS2010了,虽然我装了,但是我已经熟悉VS2008+VAX了,
特别是这三个月,天天加班,

// Just a holder
class _A
{
public:
_A(char* p)
{
m_p = p;
}
char* m_p;
};

class A
{
public:
A()
{
m_p = new char[1];
}
A(A const& a)
{

}

A(_A const& a)
{
m_p = a.m_p;
}

A sub()
{
A a;
_A t(a.Detach());
return t;
}

char* Detach()
{
return m_p;
}

char* m_p;
};


void function(A const& a)
{
int b =0;
}

int _tmain(int argc, _TCHAR* argv[])
{
A a;
function(a.sub());

return 0;
}



模拟一下,
healer_kx 2010-12-23
  • 打赏
  • 举报
回复
我认为有些回复在侮辱楼主的智商。。。可能你们没有看楼主的blog吗?
昵称很不好取 2010-12-23
  • 打赏
  • 举报
回复
顶一个~~
有机会拿第三方工具测试下
InfidelX 2010-12-23
  • 打赏
  • 举报
回复
内存泄漏的严格定义不是分配后未释放,而是动态分配内存的指针在程序中丢失导致再没有机会进行释放。
==============
顶这个
  • 打赏
  • 举报
回复
gules 2010-12-23
  • 打赏
  • 举报
回复
不用VS提供的内存检测工具而使用比较其它第三方检测工具进行过检查吗?结果是什么?
内存泄漏的严格定义不是分配后未释放,而是动态分配内存的指针在程序中丢失导致再没有机会进行释放。
job82824 2010-12-23
  • 打赏
  • 举报
回复
这个泄露可能判断不准。最好是用任务管理器,写个循环连续操作10w次,看看内存增加了没。后一种方法是最准的。有时候前一种方式只是检测了new操作的地方就认为是泄露,但其实你的代码里有对应的delete处,它却检测不到。
yuyan_linger 2010-12-23
  • 打赏
  • 举报
回复
楼主与时俱进 呵呵

对0x无研究的路过
月中蓝 2010-12-23
  • 打赏
  • 举报
回复
lz高人
ryfdizuo 2010-12-23
  • 打赏
  • 举报
回复
0x暂时不准备搞啊~
pengzhixi 2010-12-23
  • 打赏
  • 举报
回复
move语义只对右值引用有效吧,对于其他类型的按照正常的语义运行。
healer_kx 2010-12-23
  • 打赏
  • 举报
回复
好的,你给我40分就行了,我今天就升星了。
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 aflyinghorse 的回复:]

akirya:
是不是用错了,你自己可以试一下。
move不是针对临时变量的,右值引用才是。std::move可以用来把左值转为右值,如果你传一个右值给它,返回结果依然是右值。
[/Quote]
研究了下,右值确实是我理解有问题。确实是basic_string的实现有bug
pengzhixi 2010-12-23
  • 打赏
  • 举报
回复
特意找了些资料看了下,关于move的语义,无论传入的参数是左值还是右值返回的都是右值。
healer_kx 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 healer_kx 的回复:]

我认为有些回复在侮辱楼主的智商。。。可能你们没有看楼主的blog吗?
[/Quote]
还是这句话,我看了楼主的blog,问题没有那么简单。。。
aflyinghorse 2010-12-23
  • 打赏
  • 举报
回复
akirya:
是不是用错了,你自己可以试一下。
move不是针对临时变量的,右值引用才是。std::move可以用来把左值转为右值,如果你传一个右值给它,返回结果依然是右值。
aflyinghorse 2010-12-23
  • 打赏
  • 举报
回复
gules:

同意你关于内存泄漏的看法。我的文章里描述的就是这种情况,即使析构,也不会释放内存。

这个问题Microsoft VC开发小组已经知道,只不过要等到VS2010的SP1 RTM发布以后才会被fix,所以目前还是应当注意一下。
  • 打赏
  • 举报
回复
呃,看了下,move用错了。

右值引用move 时针对临时变量的。
aflyinghorse 2010-12-23
  • 打赏
  • 举报
回复
pengzhixi:
std::move可以用来把左值转为右值,当然,如果你传一个右值给它,返回结果依然是右值。
vc助手 Visual assist的2012.12.14发行的最新1925版本的补丁和原版的安装文件,这个版本新增了8个功能,修正了20余处bug,同时更好的支持了VC2012。下载的压缩包内提供了原版的安装文件和破解补丁,为了方便各位使用,具体更新列表以及补丁的使用方法参见我的博客(特别是无法破解的朋友,还有不知道如何破解VC2012的朋友,如果发现有破解不了的情况,一定是你们自己的操作哪里除了问题),因为所有的补丁都是本人在win7/win8以及VC2010和VC2012中亲测可用的 Visual Assist X   增强Microsoft开发环境下的编辑能力。   Visual Assist X具有强大的编辑特色,提高了生产效率,可以完全集成到您的Microsoft开发环境中,升级了您的IDE,在不改变编程习惯的同时就可以感受到Visual Assist X为您带来的好处。   Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有助于提高开发过程的自动化和开发效率。   结构体系   从Microsoft Visual C/C++ 6.0开始,所有的Microsoft IDE都为您的编辑环境提供了轻巧的剖析器,为您的代码编写提供方便,他们不生成目标码,这种默认帮助形式称为Intellisense。其特性包括成员列表框、完成列表框、停驻工具提示、自动参数信息。您可以在IDE对话框选项内设定每个组件的工作状态。   Visual Assist X去除了默认Intellisense的几个不足之处,采用一系列新的特性对其进行了补充,提高了IDE的可用性。其中,帮助的数量决定于IDE、所用编程语言和您设定的选项。   如同默认Intellisense,Visual Assist X也包括剖析器,运行于您的编辑过程中。该培训器同默认剖析器的不同之处在于,他们不装载预先设置的符号数据库,因此扩大了Intellisense的范围。Visual Assist X只收集您工程中的头文件和对象信息,这些头文件和对象可以包含在系统、第三方库、MFC或ATL/WTL/STL中。这意味着Intellisence的活动更加频繁,结果也更加准确。   不止是C/C++,对于所有编程语言,Visual Assist X都含有可执行的轻载默认剖析器。对于C/C++,您可以选择Visual Assist X专有Intellisense,也可以首选默认剖析器,只有当其不可用时,再采用Visual Assist X,这些工作方式都可以通过专门设置来实现。   Visual Assist X作为一种低优先度的后台线程插件,不影响您的IDE环境性能。该线程在idle期间活动,当您开始输入代码时,又回复为静默状态。并且它的剖析器不生成目标码,因此,同传统剖析器相比,占用更少的资源。   Visual Assist X提高了工作的自动化,简化了浏览,并且显示您开发过程的关键信息。其功能完全集成到IDE中,实现了二者的充分融合。为Microsoft Visual Studio .NET 2003和2002的所有编程语言提供编程助手,包括C/C++, C#, ASP, Visual Basic, Java 和 HTML,另外,还为Microsoft Visual C++ 6.0和 5.0的C/C++用户提供编程帮助。   产品特点   改进了Intellisense:成员和完成列表框的出现更加频繁、迅速,并且结果更加准确。参数信息更加完善,并带有注释。含有所有符号的停驻工具提示。   代码输入更迅速:输入时观察suggestion列表框,其中将根据您的输入提供相应的备选字符。为了更加方便的选择字符,还可以提前定义Atuotext和代码模板。   错误自动校正:监控您的IDE,对那些简单但耗时的错误进行即时校正。   信息获取更加快速:更加迅速了解代码信息,在新的VA View中观察当前的停驻类浏览器,可以获得当前符号的更多信息。除此,资源窗口中还添加了小的内容和定义项,可以获取信息快照。   增加了色彩和格式:采用了更多的色彩和格式选项,代码解译更加迅速。增强了IDE的基本语法色彩,在您输入代码的同时,突出匹配和不匹配条目。另外,还添加了column indicator和print in color,将RTF置于剪切版内。   简化了查找和浏览:查找和浏览更加轻松。通过内容查找可以快速跳到相同名称的符号处,在您工作台的任何地方都可以找到符号定义,还可以转入您代码中的符号执行处。选择您文件的列表方式,锁定头文件和相应的cpp文件。从您的工作台文件列表中打开文件。含有最近行为列表,可以在代码的活动部分之间相互转换。Move scope可以到达下一个方法,还包含往返浏览。   拼写检查:在您输入代码的同时进行检查,并且可以看到同Microsoft Word相似的红色下划线。含有Spell check comments and strings,另外,Spell check code可以检查错误的输入符号。   拓展了基本编辑:对编辑器进行了增强,编辑代码更加迅速。含有Surround selections,multiple clipboards. Sort lines。
vc助手 Visual assist的2012.12.14发行的最新1925版本的补丁和原版的安装文件,这个版本新增了8个功能,修正了20余处bug,同时更好的支持了VC2012。下载的压缩包内提供了原版的安装文件和破解补丁,为了方便各位使用,具体更新列表以及补丁的使用方法参见我的博客(特别是无法破解的朋友,还有不知道如何破解VC2012的朋友,如果发现有破解不了的情况,一定是你们自己的操作哪里除了问题),因为所有的补丁都是本人在win7/win8以及VC2010和VC2012中亲测可用的 Visual Assist X   增强Microsoft开发环境下的编辑能力。   Visual Assist X具有强大的编辑特色,提高了生产效率,可以完全集成到您的Microsoft开发环境中,升级了您的IDE,在不改变编程习惯的同时就可以感受到Visual Assist X为您带来的好处。   Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有助于提高开发过程的自动化和开发效率。   结构体系   从Microsoft Visual C/C++ 6.0开始,所有的Microsoft IDE都为您的编辑环境提供了轻巧的剖析器,为您的代码编写提供方便,他们不生成目标码,这种默认帮助形式称为Intellisense。其特性包括成员列表框、完成列表框、停驻工具提示、自动参数信息。您可以在IDE对话框选项内设定每个组件的工作状态。   Visual Assist X去除了默认Intellisense的几个不足之处,采用一系列新的特性对其进行了补充,提高了IDE的可用性。其中,帮助的数量决定于IDE、所用编程语言和您设定的选项。   如同默认Intellisense,Visual Assist X也包括剖析器,运行于您的编辑过程中。该培训器同默认剖析器的不同之处在于,他们不装载预先设置的符号数据库,因此扩大了Intellisense的范围。Visual Assist X只收集您工程中的头文件和对象信息,这些头文件和对象可以包含在系统、第三方库、MFC或ATL/WTL/STL中。这意味着Intellisence的活动更加频繁,结果也更加准确。   不止是C/C++,对于所有编程语言,Visual Assist X都含有可执行的轻载默认剖析器。对于C/C++,您可以选择Visual Assist X专有Intellisense,也可以首选默认剖析器,只有当其不可用时,再采用Visual Assist X,这些工作方式都可以通过专门设置来实现。   Visual Assist X作为一种低优先度的后台线程插件,不影响您的IDE环境性能。该线程在idle期间活动,当您开始输入代码时,又回复为静默状态。并且它的剖析器不生成目标码,因此,同传统剖析器相比,占用更少的资源。   Visual Assist X提高了工作的自动化,简化了浏览,并且显示您开发过程的关键信息。其功能完全集成到IDE中,实现了二者的充分融合。为Microsoft Visual Studio .NET 2003和2002的所有编程语言提供编程助手,包括C/C++, C#, ASP, Visual Basic, Java 和 HTML,另外,还为Microsoft Visual C++ 6.0和 5.0的C/C++用户提供编程帮助。   产品特点   改进了Intellisense:成员和完成列表框的出现更加频繁、迅速,并且结果更加准确。参数信息更加完善,并带有注释。含有所有符号的停驻工具提示。   代码输入更迅速:输入时观察suggestion列表框,其中将根据您的输入提供相应的备选字符。为了更加方便的选择字符,还可以提前定义Atuotext和代码模板。   错误自动校正:监控您的IDE,对那些简单但耗时的错误进行即时校正。   信息获取更加快速:更加迅速了解代码信息,在新的VA View中观察当前的停驻类浏览器,可以获得当前符号的更多信息。除此,资源窗口中还添加了小的内容和定义项,可以获取信息快照。   增加了色彩和格式:采用了更多的色彩和格式选项,代码解译更加迅速。增强了IDE的基本语法色彩,在您输入代码的同时,突出匹配和不匹配条目。另外,还添加了column indicator和print in color,将RTF置于剪切版内。   简化了查找和浏览:查找和浏览更加轻松。通过内容查找可以快速跳到相同名称的符号处,在您工作台的任何地方都可以找到符号定义,还可以转入您代码中的符号执行处。选择您文件的列表方式,锁定头文件和相应的cpp文件。从您的工作台文件列表中打开文件。含有最近行为列表,可以在代码的活动部分之间相互转换。Move scope可以到达下一个方法,还包含往返浏览。   拼写检查:在您输入代码的同时进行检查,并且可以看到同Microsoft Word相似的红色下划线。含有Spell check comments and strings,另外,Spell check code可以检查错误的输入符号。   拓展了基本编辑:对编辑器进行了增强,编辑代码更加迅速。含有Surround selections,multiple clipboards. Sort lines。   适合您个人风格的配置特色:细化选项对话框,定义Visual Assist X特性以适应您的编程习惯。内容菜单中含多个命令,设置快捷方式可以加快访问您所偏好的命令。可以禁止或允许Visual Assist X,或者强制其重新剖析从而更加智能化。   版本新特色   支持多种编程语言:Microsoft Visual Studio .NET的所有编程语言,包括C#, ASP, Java, Javascript, Basic 和 VBScript等。   单一安装,适合所有IDE:去除了针对不同IDE的单个产品,下载后,Visual Assist X可以安装到您的全部Microsoft IDE中,如果又安装了新的IDE,只需重新安装一次Visual Assist X即可。   紧密集成:Visual Assist X更加紧密的集成到了您的IDE中,利用Microsoft的Add-In和VSIP接口,无需离开IDE或改变编码习惯就可以运行Visual Assist X。为了更好的集成,还包含新的菜单条目、更多的键捆绑,并去除了冗余选项。   更多的特色:包含建议列表框(Suggestion listboxes)、停驻类浏览器(hovering class browser)、语法上色(syntax coloring)、访问最近应用的文件和符号等。   更好的文档:产品含有优秀的文档说明,选项对话框中包含信息工具提示,另外,在我们的网站上也含有关于Visual Assist X的充分信息。   增强的列表框,支持所有编程语言   过滤工具条,列表框支持输入过程中的内容过滤功能,可以将列表框内容限制为公共方法、资源、枚举等。   支持单词首字母缩写,输入一个缩写,Visual Assist X 将自动查找您所需要的符号。   速记,无需输入整个单词就可以查找某个符号,不同于首字母缩写,速记功能仅需要您知道某个符号的某个子字符串即可。   改进的提示列表,提示更加准确和频繁。   新的拼写引擎可以更加准确全面的检查您的拼写,推荐更好的替换操作,还可以处理缩写等语言结构。   改进的选项对话框,更加简单,新增了超链接选项。   其他——   新的安装程序支持更多环境   当您滚动列表框时,定义域不在更新,避免了转移闪烁现象   HCB图标可以表示更多的条目集合,如C#中的事件和资源等。   完成列表框中保留词表现为一个新的图标。   系统需求   Visual Assist X可以工作于任何Microsoft IDE和操作系统。   开发环境:Visual Assist X兼容于开发环境   操作系统:   Windows XP Server 2003   Windows XP Professional   Windows XP Home Edition   Windows 2000 Professional   Windows 2000 Server

64,691

社区成员

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

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