免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3243 | 回复: 10
打印 上一主题 下一主题

在win下测试没有问题,在linux下内存就是不释放,怎么办? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-21 10:10 |只看该作者 |倒序浏览
我自己写了一个类,来管理数据列表.

在win下测试没有问题,内存会不断增加,然后不断释放;但在linux下,申请完成后,内存就是不释放,一直是那么多,怎么办?我的问题出在哪里?谢谢大家~~~
CSuperList.h:

#ifndef CSUPERLIST_H
#define CSUPERLIST_H

#include <stdlib.h>
//#include

typedef struct _ListNode
{
    short Len;                    //节点数据长度

    void *pData;                //数据指针

    struct _ListNode *pNext;    //下一个节点指针

    _ListNode()
    {
        Len = 0;
        pData = 0;
        pNext = 0;
    };
}ListNode,*pListNode;

class CSuperList
{
    public:
        CSuperList();
        virtual ~CSuperList();
        int AddTail(short len,void *pData);
        ListNode *GetHead();
        void DelNode(ListNode *pCurrentNode);

        int GetCount();
        void SetMode(char mode);
        //仅当m_mode = 0;取后不删除有效

        ListNode *GetNext(ListNode *pCurrentNode);
        void RemoveNext(ListNode *pCurrentNode);
    protected:
    private:
        char m_mode;        //取后自动删除;0,不删除,默认0;1,删除

        int m_nCount;        //节点总数

        ListNode *pHead;    //当前的头

        ListNode *pTail;    //当前的尾


        //pthread_mutex_t mlock;

};

#endif // CSUPERLIST_H


CSuperList.cpp:

#include "CSuperList.h"

CSuperList::CSuperList()
{
    m_mode = 0;            //取后自动删除;0,不删除,默认0;1,删除

    m_nCount = 0;        //节点总数

    pHead = 0;            //当前的头

    pTail = 0;            //当前的尾

    //pthread_mutex_init(&mlock,0);

}

CSuperList::~CSuperList()
{
    //dtor

}
void CSuperList::SetMode(char mode)
{
    m_mode = mode;
}

int CSuperList::AddTail(short len,void *pData)
{
    //pthread_mutex_lock(&mlock);     //上锁


    ListNode *pCurrNode =(ListNode *)malloc(sizeof(ListNode));
    if (!pCurrNode)
        return -1;

    pCurrNode->Len = len;
    pCurrNode->pData = pData;
    pCurrNode->pNext = 0;

    if (pTail)
    {
        pTail->pNext = pCurrNode;
        pTail = pCurrNode;
    }
    else
    {
        pHead = pTail = pCurrNode;
    }

    m_nCount++;

    //pthread_mutex_unlock(&mlock);        //解锁

    return 0;
}

//请自己释放Node

ListNode *CSuperList::GetHead()
{
    //pthread_mutex_lock(&mlock);     //上锁

    ListNode *Node = pHead;
    if ((pHead!=0) && m_mode )
    {
        pHead = pHead->pNext;
        m_nCount--;
        if (pHead==0)
            pTail = 0;
    }

    //pthread_mutex_unlock(&mlock);        //解锁

    return Node;
}
void CSuperList::DelNode(ListNode *pCurrentNode)
{
    if(pCurrentNode)
    {
        //        if(pCurrentNode->pData)        //帮他把数据也释放了吧--不能帮,可能其他地方有使用

        //        {

        //            free(pCurrentNode->pData);

        //            pCurrentNode->pData = 0;

        //        }

        free(pCurrentNode);
        pCurrentNode = 0;
    }
    return ;
}


int CSuperList::GetCount()
{
    return m_nCount;
}
//仅当m_mode = 0;取后不删除有效

ListNode *CSuperList::GetNext(ListNode *pCurrentNode)
{
    return pCurrentNode->pNext;
}
void CSuperList::RemoveNext(ListNode *pCurrentNode)
{
    //pthread_mutex_lock(&mlock);     //上锁

    ListNode *RemoveNode = pCurrentNode->pNext;
    if (RemoveNode)
    {
        if (RemoveNode == pTail)
            pTail = pCurrentNode;

        pCurrentNode->pNext = RemoveNode->pNext;
        m_nCount--;
        DelNode(RemoveNode);
    }

    //pthread_mutex_unlock(&mlock);        //解锁

    return;
}




main.cpp

#include <stdio.h>
#include <stdlib.h>
//#include

#include <string>
#include <iostream>
#include "CSuperList.h"

int main()
{
    CSuperList    m_SqlTaskList;
    m_SqlTaskList.SetMode(1);   
    char *sql=0;
    int i=0,n=0;
    for(i=0;i<100000;i++)
    {
        sql =(char *)malloc(1024);
        if (sql)
        {
            m_SqlTaskList.AddTail(1024,sql);
            //printf("n=%d,sql=%d\n",n++,sql);

        }
    }
    printf("@@@@@@@@@@@@@ n=%d\n",n);
    sleep(10);

    ListNode *pListNode = NULL;
    n=0;
    printf("@@@@@@@@@@@@@ while GetCount=%d\n",m_SqlTaskList.GetCount());
    pListNode = m_SqlTaskList.GetHead();
    while (pListNode)
    {
        sql = (char *)pListNode->pData;
        if (sql )
        {
            //printf("n=%d,sql=%d\n",n++,sql);

            free(sql);
            sql = NULL;
        }
        m_SqlTaskList.DelNode(pListNode);
        pListNode = m_SqlTaskList.GetHead();
        if (!pListNode)
            printf("####### pListNode is NULL\n");
    }

    printf("####### while end \n");
    int num=m_SqlTaskList.GetCount();
    printf("GetCount=%d\n",num);

    sleep(1000);
    return 0;
}


编译:
g++ *.cpp -o testSuperList

我实在找不出问题了.在win下是可以成功释放的...恳请大家帮我分析分析...谢谢

附件是上面三个文件,可以编译直接运行

testSuperList_linux.tar

6.5 KB, 下载次数: 32

论坛徽章:
0
2 [报告]
发表于 2009-08-21 13:15 |只看该作者
大家帮看看啊...
我找不到原因了....

论坛徽章:
0
3 [报告]
发表于 2009-08-21 13:45 |只看该作者
linux的内存管理不会立即回收内存,而是先存在缓冲池中,以便下一次利用。
所以一旦看到linux占内存都很大

论坛徽章:
0
4 [报告]
发表于 2009-08-21 15:04 |只看该作者
原帖由 emmoblin 于 2009-8-21 13:45 发表
linux的内存管理不会立即回收内存,而是先存在缓冲池中,以便下一次利用。
所以一旦看到linux占内存都很大


可是我申请了1G内存,用过了.然后他就一直在那里...看着他那么高的内存占用,担心他哪一天会core了...

那如果是这样,多长时间系统会收回呢?

论坛徽章:
0
5 [报告]
发表于 2009-08-21 15:18 |只看该作者
但我直接申请,直接释放,是立刻就释放了的

char * buf=(char*)malloc(10240000);
sleep(10);
free(buf);
buf=NULL;

这样是可以看到内存变化的....

论坛徽章:
0
6 [报告]
发表于 2009-08-24 09:55 |只看该作者
UP

论坛徽章:
0
7 [报告]
发表于 2009-08-28 16:54 |只看该作者
main.cpp

main函数中调用了Sleep函数,在Windows下是毫秒为单位的,linux下是以秒为单位的。
如果你耐心等上10秒,应该可以看到内存释放的

论坛徽章:
0
8 [报告]
发表于 2009-09-02 16:57 |只看该作者

回复 #7 godenjing 的帖子

谢谢回复.

我一定等待超过10秒的.不可能犯这种错误的...

大家都没有这个问题吗?我的问题在哪里?谢谢大家

论坛徽章:
0
9 [报告]
发表于 2009-09-03 14:02 |只看该作者
大家帮帮忙啊.这个困扰我很久了

论坛徽章:
0
10 [报告]
发表于 2009-09-04 16:05 |只看该作者
原帖由 superdbs 于 2009-8-21 15:04 发表


可是我申请了1G内存,用过了.然后他就一直在那里...看着他那么高的内存占用,担心他哪一天会core了...

那如果是这样,多长时间系统会收回呢?


如果现在系统的memory压力不是很大的话,linux会尽量满足你的要求,而且不会立即回收。这样可以在内存尽量cache你的数据。

如果有别的process向内核要求memory,而内核分配不出的时候,内核会开始回收内存。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP