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

aflyinghorse 2010-12-23 09:58:32
这是我写的一篇文章,关于VS2010 STL可能内存泄露,欢迎各位发表评论,谢谢。
http://blog.csdn.net/aflyinghorse
...全文
288 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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可以用来把左值转为右值,当然,如果你传一个右值给它,返回结果依然是右值。

65,186

社区成员

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

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