- 论坛徽章:
- 0
|
我自己写了一个类,来管理数据列表.
在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下是可以成功释放的...恳请大家帮我分析分析...谢谢
附件是上面三个文件,可以编译直接运行 |
|