是不是stl容易导致死机

donkey301 2010-04-14 11:01:04
我想测试stl是否可以用引用计数,代码如下:

// TestX1X2X3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
class RefObj
{
public:
RefObj()
{
m_Ref = 0;
}
int AddRef();
int Release();

private:
int m_Ref;
};

int RefObj::AddRef()
{
return ++m_Ref;
}

int RefObj::Release()
{
int nRef = --m_Ref;
if (nRef==0)
{
delete this;
}
return nRef;
}


int _tmain(int argc, _TCHAR* argv[])
{
RefObj* aRefObj = new RefObj;
aRefObj->AddRef();
std::vector<RefObj*> ListRef;
ListRef.push_back(aRefObj);
aRefObj->Release();

return 0;
}


用VS2005编译,第一次F5后没问题,第二次100%导致死机,大部分在ListRef.push_back(aRefObj)这行时死机。
1. 我在其它两个机子上没出现这种情况,说明应该与我的机子有关。
2. 删除

std::vector<RefObj*> ListRef;
ListRef.push_back(aRefObj);

这两行也没问题。

我想问一下这种情况是不是就是stl使用不当造成的,谁能详细的解释一下为什么会导致死机? 我觉得F5结束后这个程序所用的内存应该自动释放了,不影响下次才对呀?
...全文
230 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypb362148418 2010-04-14
  • 打赏
  • 举报
回复
死机貌似跟STL没有什么关系吧
jhony_lee 2010-04-14
  • 打赏
  • 举报
回复
死机是跟你的程序有关吧,与stl有什么关联吗?
chainyu 2010-04-14
  • 打赏
  • 举报
回复
	while(1)
{
RefObj* pRefObj = new RefObj;
pRefObj->AddRef();
std::vector<RefObj*> ListRef;
ListRef.push_back(pRefObj);
pRefObj->Release();

}


vs2008没有问题
taodm 2010-04-14
  • 打赏
  • 举报
回复
那再换gcc试呀。
s79947171 2010-04-14
  • 打赏
  • 举报
回复
int main()
{
RefObj* aRefObj = new RefObj;
aRefObj->AddRef();
std::vector<RefObj*> ListRef;
ListRef.push_back(aRefObj);
aRefObj->Release(); //这里释放了,ListRef中的aRefObj也就不存在了,但是应该没问题啊这段代码

return 0;
}
pengzhixi 2010-04-14
  • 打赏
  • 举报
回复
你的内存泄露了。
herman~~ 2010-04-14
  • 打赏
  • 举报
回复
木有看出啥子问题,杯具
jamseyang 2010-04-14
  • 打赏
  • 举报
回复
关注中!
s79947171 2010-04-14
  • 打赏
  • 举报
回复
VS 2005下运行这段代码没有任何问题
donkey301 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 loaden 的回复:]

看起来应该是delete this的问题。
自杀是很危险的。

不过,我在VS2008下测试这个代码,并没有发现崩溃的现象。
建议将:

int RefObj::Release()
{
int nRef = --m_Ref;
if (nRef==0)
{
delete this;
}
return nRef;
}……
[/Quote]
按你的意思换成了void
测试结果是第4次F5死机,不想重复了,因为每次死机我都要手动重启。应该还是有问题。
能不能帮我分析一下:
1. 我的机子调试其他程序为什么没有这种情况?内存泄露的例子我也调试了很多个了,但没有一个是可以导致死机的。
2. 我的机子到底和别人的机子有什么不同,别人就可以运行结束。
3. 还有一点,是不是F5调试结束内存就会全部释放,而不会影响下一次的调试?看我这个例子好像影响了。
rendao0563 2010-04-14
  • 打赏
  • 举报
回复
你的2005打过sp1没?
「已注销」 2010-04-14
  • 打赏
  • 举报
回复
看起来应该是delete this的问题。
自杀是很危险的。

不过,我在VS2008下测试这个代码,并没有发现崩溃的现象。
建议将:

int RefObj::Release()
{
int nRef = --m_Ref;
if (nRef==0)
{
delete this;
}
return nRef;
}

改成:

void RefObj::Release()
{
int nRef = --m_Ref;
if (nRef==0)
{
delete this;
}
}
再试试?

内容概要:本文详细描述了机械零件Part4的设计与建模过程,重点围绕三维建模中的几何构造操作展开。首先基于原零件三视图确定关键尺寸,依次创建多个同心圆柱体结构,包括外层圆柱体(52、52、5)、中间圆柱体(25、25、7)以及中心孔结构(16、16、12)。随后对底部圆柱体进行临时加高处理,以便在顶面草绘中构建辅助图形:以计算得出的半径17.5画圆,并在其接触面上方绘制半径为3的小圆,进而引出两条分别成60°和-60°的斜线,配合一条水平线形成三角形轮廓。接着在其余两角复制相同的小圆结构,清理多余线条后完成草图设计。利用该草图执行“拉伸切除”操作,深度设为16.28mm,实现特征开槽。最后将底部圆柱体恢复原始高度5mm,完成整体结构修改。; 适合人群:具备基础CAD建模能力的机械设计人员或工科类学生;熟悉SolidWorks、AutoCAD等三维设计软件的操作者;从事零部件逆向设计或结构优化的技术人员。; 使用场景及目标:①用于学习复杂零件的分步建模方法,掌握从三视图到三维实体的转换技巧;②理解拉伸、切除、草图约束、包围盒设置等核心建模命令的实际应用;③提升对尺寸链计算、辅助线构建及几何关系控制的理解与实践能力。; 阅读建议:建议结合文中参数逐步在建模软件中复现操作,重点关注草图绘制逻辑与切除特征的关联性,注意各步骤间的顺序依赖关系,避免因尺寸或约束错误导致建模失败。

65,214

社区成员

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

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