内存占用越来越大?

w20011025 2011-05-25 11:52:13

#include <stdio.h>
#include <vector>
#include <string>
#include <windows.h>
using namespace std;
class CDeviceEntity
{
public:
int i;
string s1;
};
typedef std::vector<CDeviceEntity>DEVICES;
CDeviceEntity Entity;
DEVICES devs;
string strTemp;
int main()
{
start:
char ch[30];
for(int i=0;i<100;i++)
{
sprintf(ch,"×Ö·û´®Êä³ö %d",i);
Entity.i=i;
// Entity.s1=ch;

strTemp.assign(ch,i);
Entity.s1+=strTemp;
devs.push_back(Entity);
}

DEVICES::iterator dIter;
for(dIter=devs.begin();dIter!=devs.end();dIter++)
{
printf("%d %s\n",dIter->i,dIter->s1.c_str());
// printf("%d %p %p\n",dIter->i,dIter->i,dIter->s1.c_str());
}
printf("%=========================================================\n");
printf("%s %d %d %d %d\n",Entity.s1.c_str(),devs.max_size(),devs.size(),
Entity.s1.capacity(), Entity.s1.length());

if(!devs.empty())devs.clear();
Sleep(1500);
goto start;
return 0;
}
Entity.s1.capacity()和Entity.s1.length()的值越来越大?内存没释放掉?
Entity.s1.c_str()值,显示错误?
...全文
184 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljt3969636 2011-05-25
  • 打赏
  • 举报
回复
不好意思,不细心
你的DEVICES devs;定义在全局作用域中,我以为在main函数中定义的,上面的代码没意义,你可以把DEVICES devs;放在 上面代码中char ch[30];之前括号之后看看。
ljt3969636 2011-05-25
  • 打赏
  • 举报
回复
试试这样
int main()
{
start:
{//局部化开始位置
char ch[30];
for(int i=0;i<100;i++)
{
sprintf(ch,"×Ö·û´®Êä³ö %d",i);
Entity.i=i;
// Entity.s1=ch;

strTemp.assign(ch,i);
Entity.s1+=strTemp;
devs.push_back(Entity);
}

DEVICES::iterator dIter;
for(dIter=devs.begin();dIter!=devs.end();dIter++)
{
printf("%d %s\n",dIter->i,dIter->s1.c_str());
// printf("%d %p %p\n",dIter->i,dIter->i,dIter->s1.c_str());
}
printf("%=========================================================\n");
printf("%s %d %d %d %d\n",Entity.s1.c_str(),devs.max_size(),devs.size(),
Entity.s1.capacity(), Entity.s1.length());

if(!devs.empty())devs.clear();
Sleep(1500);
}//局部化结束位置
goto start;
return 0;
}
w20011025 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ljt3969636 的回复:]
devs.empty())devs.clear() 会清除内部元素,但是devs的实际空间一般是要devs的析构来释放的。
[/Quote]但占用内存仍然会越来越大,且打印内容错误?方法?
ljt3969636 2011-05-25
  • 打赏
  • 举报
回复
devs.empty())devs.clear() 会清除内部元素,但是devs的实际空间一般是要devs的析构来释放的。
abcdef0966 2011-05-25
  • 打赏
  • 举报
回复
不理解
w20011025 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 namelij 的回复:]
你一直不断的赋值,当然变大了
[/Quote]清空??
  • 打赏
  • 举报
回复
你一直不断的赋值,当然变大了
luciferisnotsatan 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 w20011025 的回复:]

引用 10 楼 luciferisnotsatan 的回复:
if(!devs.empty())devs.clear();
Entity.s1="";
Sleep(1500);

清空下s1

有点不明白,这段代码不是已经清空了吗?C/C++ code
if(!devs.empty())devs.clear();

为什么还要Entity.s1="";?
[/Quote]

devs.clear()清的是 devs这个全局变量,又没清Entity这个全局变量。Entity.s1这个string不停的追加,内存使用当然越来越多了。
你一共有3个全局变量
typedef std::vector<CDeviceEntity>DEVICES;
CDeviceEntity Entity; 这个是每次追加 +=
DEVICES devs; 这个有clear清
string strTemp; 这个是每次赋值。(不用清)

bingxinzhimeng88 2011-05-25
  • 打赏
  • 举报
回复
题目目的是从标准输入读取一些字符,并把它们写到标准输出上,同时计算sum值。
w20011025 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 luciferisnotsatan 的回复:]
if(!devs.empty())devs.clear();
Entity.s1="";
Sleep(1500);

清空下s1
[/Quote]
有点不明白,这段代码不是已经清空了吗?
if(!devs.empty())devs.clear();
为什么还要Entity.s1="";?
luciferisnotsatan 2011-05-25
  • 打赏
  • 举报
回复
if(!devs.empty())devs.clear();
Entity.s1="";
Sleep(1500);

清空下s1
yfk 2011-05-25
  • 打赏
  • 举报
回复
class CDeviceEntity
{
public:
int i;
string s1;
};
CDeviceEntity::s1这个变量,LZ循环中用:Entity.s1+=strTemp;
Entity是个全局变量,所以它的capacity和length会不断增长。
luciferisnotsatan 2011-05-25
  • 打赏
  • 举报
回复
Entity.s1这个string又没清空过

代码里就不停地加额

Entity.s1+=strTemp;

64,636

社区成员

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

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