惠普UNIX机器使用STL严重内存泄漏,高手帮忙压。

痞子酷 2005-04-25 07:42:34
惠普:
HP-UX COMMTEST B.11.11 U 9000/800 (tb)

你可以使用top查看内存情况。
测试代码:
#include <stdio.h>
#include <string>
#include <malloc.h>

#include <vector>

//using namespace std;

void PrintfMallInfo()
{
static int i=0;
char tempBuf[1204];
struct mallinfo mInfo=mallinfo();
sprintf(tempBuf,"[%d]mallinfo:arena=%d ordblks=%d smblks=%d hblks=%d hblkhd=%d usmblks=%d fsmblks=%d uordblks=%d fordblks=%d keepcost=%d",
i,
mInfo.arena,
mInfo.ordblks,
mInfo.smblks,
mInfo.hblks,
mInfo.hblkhd,
mInfo.usmblks,
mInfo.fsmblks,
mInfo.uordblks,
mInfo.fordblks,
mInfo.keepcost);
printf("%s\n",tempBuf);
i++;
}

void test()
{
vector <string> aVect;
PrintfMallInfo();
for(long i=0;i<1024*1024*10;i++)
{
//string aaa="aaaaaaaaaa";
aVect.push_back("aaaaaaaaaa");
}
aVect.clear();
PrintfMallInfo();
}

int main()
{
for(;;)
{
PrintfMallInfo();
test();
PrintfMallInfo();
}
}


...全文
481 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
jglxgz 2005-04-29
  • 打赏
  • 举报
回复
搞定恭喜了!
gaoxianfeng 2005-04-29
  • 打赏
  • 举报
回复
疑问

1024*1024 和 1024*1024*10 相差可不小

你以前在函数退出后内存都不减少?! 如下处
PrintfMallInfo();
test(); //?
PrintfMallInfo();
tengulre 2005-04-29
  • 打赏
  • 举报
回复
up
痞子酷 2005-04-29
  • 打赏
  • 举报
回复
谢谢 各位的支持,问题我已经解决啦。
描述如下:
本人认为bea调用服务方式,采用是长跳转方式,在执行tpreturn函数成功后,其函数后面的代码将永远不会被执行,
而是跳转到服务入口处,等待再次被调用。其调用方式,于递归调用是相一致的:

举例如下:
Do_Service(FBFR32 *fReq32)
{
//申请空间
...
// 释放空间
tpreturn ; //跳转到入口处,,重新调用Do_Service(FBFR32 *fReq32),采用长跳转方式。
}

由于代码中tpreturn跳转到入口处,,重新调用Do_Service(FBFR32 *fReq32),采用长跳转方式,相当于我们所说的
递归调用,即:
void Do_Service()
{
int x;
PrintfMallInfo();
vector <string> aVect;
long maxrepeat = 1024*1024;
for(long i=0; i<maxrepeat; i++)
aVect.push_back("aaaaaaaaaa");

aVect.clear();
//本次申请的内存并没有释放,直至该函数结束才真正释放,被进程再次使用。

Do_Service();//递归调用Do_Service
}
将导致进行函数递归中,申请的内存并没有释放,直至该函数结束才真正释放,被进程再次使用,由于函数递归,函数永远不会结束,除非进程退出,该函数
申请的内存才释放。


因此,改为下面的方式,内存将不会增长。
如果:
void test()
{
int x;
PrintfMallInfo();
vector <string> aVect;
long maxrepeat = 1024*1024;
//申请空间
for(long i=0; i<maxrepeat; i++)
aVect.push_back("aaaaaaaaaa");

aVect.clear();
//释放空间
} //函数结束时,释放该函数占用的空间,被进程再次使用。

void Do_Service()
{
test();
Do_Service();//递归调用Do_Service
}

服务调用方式,也是这样。


现在服务改为了下面这种方式,并进行测试,发现没有内存到底申请最大值后,就不再增长。
代码如下:
#define _Do_Service(fReq32) FBFR32 *fRet32=Do_Service(fReq32);\
if(TPCallFlag==0) \
tpreturn(TPSUCCESS, 0, (char*)fRet32, 0L, 0); \
else \
tpreturn(TPFAIL, 0, (char *)fRet32, 0L, 0);

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
DynaSQL(TPSVCINFO *rqst)
#else
DynaSQL(rqst)
TPSVCINFO *rqst;
#endif
{
//定义服务类型
ServType = 999;

//实际处理
_Do_Service((FBFR32 *)rqst->data);
}

FBFR32 *Do_Service()
{
...
int x;
PrintfMallInfo();
vector <string> aVect;
long maxrepeat = 1024*1024;
//申请空间
for(long i=0; i<maxrepeat; i++)
aVect.push_back("aaaaaaaaaa");

aVect.clear();
...
return fRet32;
}
step_by_step 2005-04-29
  • 打赏
  • 举报
回复
呵呵,又是hpux,建议不要在多线程模式下用hpux上的string

sharkhuang 2005-04-28
  • 打赏
  • 举报
回复
肯定是使用错误!

somedummy 2005-04-28
  • 打赏
  • 举报
回复
我测试的时候用的是VC++ .Net 2003的编译器,好像g++的行为也是一样的……

手上没有机器,过几天试试看……
gaoxianfeng 2005-04-28
  • 打赏
  • 举报
回复

我看了一下我的stl vector = 操作符重载实现
以vector<int> empty;
v1=empty;
为例

条件1 不满足 empty.size()>v1.capacity() //除非此时你的
2 应该满足 v1.size()>=empty.size() //此处 只调用了_Destroy 而他只调用了 你的模板元素的析够函数 不会释放vector所占用内存 所以 不成 不知道你的实现如何 我怀疑你的v1可能在v1=empty前capacity就为 0 只是猜测 但大部分stl应该是依据同一标准吧?
3 其它

gaoxianfeng 2005-04-28
  • 打赏
  • 举报
回复
:)
clear 在我这里是 erase(begin, end)
而且大部分stl都是erase(begin, end)

而你说的v1=empty
我也尝试了 我这里不成
这个方法我在尝试 swap 不成功后 尝试了一下 不成
somedummy 2005-04-27
  • 打赏
  • 举报
回复
top看到的不准吧?

就算是malloc/free也是一样的,不相信的话,你可以用
int main()
{
void* ptr = malloc(0x7ffffff);
free(ptr);
sleep(10);
}
试试看,内存同样不会被释放。

另外,你调用vector<T>::capacity看看vector占用的空间是不是真的被释放了先……还有,这个问题也未必是vector引起的,搞不好是string也不一定……
somedummy 2005-04-27
  • 打赏
  • 举报
回复
楼上搞错了吧?clear是把capacity也要修改的,而erase是仅修改size,而不修改capacity

如下代码也可以导致capacity的修改
vector<int> v1(1000,10);
vector<int> empty;
v1=empty;
cout<<v1.capacity();可以看到输出的是0
痞子酷 2005-04-27
  • 打赏
  • 举报
回复
谁有STLforUNIX 开发包,且自动释放内存。
痞子酷 2005-04-27
  • 打赏
  • 举报
回复
但是WINDOWS 却自动释放。好奇怪。管理机制不一样呀。
痞子酷 2005-04-27
  • 打赏
  • 举报
回复
我在使用惠普:
HP-UX COMMTEST B.11.11 U 9000/800 (tb)
下开发三层结构,使用tuxdo 7。1版本,在服务中使用了VECTOR,我在测试试,只要使用VECTOR后,应用程序内存会猛增,不在回收,直至崩溃。
我已和BEA公司联系啦,还没有找到办法。
gaoxianfeng 2005-04-27
  • 打赏
  • 举报
回复
而且通常的stl vector 是从不release内存的
也就是他的功能只能实现占用内存空间从小往大扩 不能反过来
gaoxianfeng 2005-04-27
  • 打赏
  • 举报
回复
我不知道 你stl如何 不同的 stl实现不同

我把我的vector 继承了一下
可以实现在没有执行析够vector对象前 达到内存释放的目的
你可以根据这个思路改一下
template <class _Tp, class _Alloc=allocator<_Tp> >
class vector_test : public vector<_Tp, _Alloc>
{
public:
typedef _Tp value_type;
typedef value_type* pointer;
int capacity1(){return capacity();}
void test(){
printf("????\r\n");
pointer __tmp = _M_allocate_and_copy(0, _M_start, _M_finish);
_Destroy(_M_start, _M_finish);
_M_deallocate(_M_start, _M_end_of_storage - _M_start);
_M_start = __tmp;
_M_finish = __tmp;
_M_end_of_storage = _M_start;
}
};

然后
vector_test <string> aVect;
printf("allocator_type is %d \r\n", aVect.capacity());
printf("sleep 0 %d\r\n", aVect.size());
sleep(10);
aVect.clear();
aVect.test();
printf("sleep %d \r\n", aVect.capacity());
sleep(10);
我会看到内存在aVecttest执行后会 回到for前的状态

另 我前面的回帖
可能你没有注意
vector <string> aVect;
string aaa="aaaaaaaaaa";
估计至少可以使程序运行时间减少1/3
who_how 2005-04-26
  • 打赏
  • 举报
回复
试试看这样:
aVect.clear();
改为:
aVect.clear();
aVect.reserve(0);
elvis200_200 2005-04-26
  • 打赏
  • 举报
回复
你回收它不就完了吗?

qfxx 2005-04-26
  • 打赏
  • 举报
回复
gz
neo954 2005-04-26
  • 打赏
  • 举报
回复
我在Intel(R) Celeron(R) CPU 1.70GHz, 512M RAM, Debian GNU/Linux 3.1, gcc version 3.3.5上面试了一下。大概最多用了325816320Bytes内存,这大约是310MB。

也许是你的机器上STL vector class的clear() member function有问题。也许可以考虑移植一个其他版本的STL到你的机器上。不过,现看看你的测试结果再说……

~~~~snip~~~~
[0]mallinfo:arena=0 ordblks=1 smblks=0 hblks=0 hblkhd=0 usmblks=0 fsmblks=0 uordblks=0 fordblks=0 keepcost=0
[1]mallinfo:arena=0 ordblks=1 smblks=0 hblks=0 hblkhd=0 usmblks=0 fsmblks=0 uordblks=0 fordblks=0 keepcost=0
[2]mallinfo:arena=2179072 ordblks=8 smblks=0 hblks=80 hblkhd=325816320 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=25328 keepcost=3824
[3]mallinfo:arena=2179072 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=25328 keepcost=3824
[4]mallinfo:arena=2179072 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=25328 keepcost=3824
[5]mallinfo:arena=2179072 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=25328 keepcost=3824
[6]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=80 hblkhd=325816320 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[7]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[8]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[9]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[10]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=80 hblkhd=325816320 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[11]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[12]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[13]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[14]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=80 hblkhd=325816320 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[15]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[16]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[17]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[18]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=80 hblkhd=325816320 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[19]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[20]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[21]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[22]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=80 hblkhd=325816320 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[23]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
[24]mallinfo:arena=2310144 ordblks=8 smblks=0 hblks=79 hblkhd=258703360 usmblks=0 fsmblks=0 uordblks=2153744 fordblks=156400 keepcost=134896
~~~~snip~~~~
加载更多回复(9)

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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