关于C++中的STL

[复制链接]
查看11 | 回复4 | 2011-3-24 13:14:51 | 显示全部楼层 |阅读模式
比如我现在有个结构体
typedef struct
{
int l_project_id;//项目号
int l_branch_id;//部门号
}pro;
typedef pro * PPro;
然后声明一个std::multiset project;
然后有一条线程专门访问数据库,读取数据信息。线程中PPro通过malloc生成PPro对象
DWORD WINAPI FUNSynProc(LPVOID lpParamter)
{
PPro proins = (PPro)(malloc(sizeof(pro)));
while (true)
{
//使用前清空project
project.clear();
//读取数据库将信息写入PPro
project.insert(PPro);
sleep();
}
free(PPro);
}
这样会产生的问题是:每次用完后Project虽然会clear但是进行占用的内存还是在不断增加,PPro占用的内存其实根本没有被释放。这样刚开始运行是没有问题的,过了一段时间程序就崩溃了。这种情况怎么解决啊?
如果插入的是结构体会不会影响效率?因为我处理的数据对效率要求很高,网上说使用指针能提高效率,所以就用指针了。而且插入的如果是结构体而不是结构体指针multiset会报错啊。

回复

使用道具 举报

千问 | 2011-3-24 13:14:51 | 显示全部楼层
楼主,你给的信息不够多,无法判断你到底要做什么。为什么你要用multiset,每次填一个结构体进去然后又clear掉?目前到的有以下问题,建议改掉:首先,C++程序不建议使用malloc/free,而推荐使用new/delete然后,是multiset容器的问题。multiset::clear只是把对象从multiset中移除,而没有把它们从内存中移除,导致内存泄漏。解决方案:第一步,添加析构函数,把:typedef struct{
int l_project_id;//项目号
int l_branch_id;//部门号}pro;typedef pro * PPro;改为
回复

使用道具 举报

千问 | 2011-3-24 13:14:51 | 显示全部楼层
clear只是把该对象从容器中清除,但对象本身仍存在,你是首先malloc分配出来一段内存空间放入堆中,所以在clear前仍需将此空间释放,使用free(); 我通过代码再具体说一下吧: multiset::iterator iter;//此处需要加入这行代码 PPro proins =(PPro)malloc(sizeof(pro)
回复

使用道具 举报

千问 | 2011-3-24 13:14:51 | 显示全部楼层
为什么要用multiset?用list不可以吗?这么写你的程序:std::list project;while(true) {project.clear();// 其实我很怀疑你这句写错了地方。每次刚插入一条记录,你就clear,那project里岂不是永远只有一条记录?pro p;// 从数据库读入记录
回复

使用道具 举报

千问 | 2011-3-24 13:14:51 | 显示全部楼层
multiset里面是指针,不是普通对象,project.clear()仅仅是把multiset清楚掉,并没有释放你申请的内存。如果用typedef pro PPro;就不会有这个问题。如果非要用typedef pro * PPro;那么需要自定义project的clear方法了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行