堕落不振功业废,勤耕不辍日月新

Tuxedo中string导致内存泄漏

C/C++ hailen 348℃

对象创建的时候会调用构造函数来初始化对象,对象销毁的时候会调用析构函数。

普通的自动变量(local非static)包含构造函数和析构函数。
当进入变量作用域的时候构造函数被调用,当离开变量作用域的时候析构函数被调用。

当在tuxedo的环境中调用 tpreturn() 或者 tpforward() 函数时,编译器进行了一个non-local的goto (using longjmp(3)),导致自动变量的析构函数没有被调用。

为了避免这个问题,我们应该在服务体中调用直接调用 tpreturn()tpforward() (而不是在服务体调用的函数中调用这两个函数)。

ps:

1.服务体中不能包含包含析构函数的变量,特别是string变量,这些带析构函数的自动变量需要放到函数调用体中,这样当离开函数的作用域的时候,会析构这些变量。如果在服务体中有string变量,那么随着服务循环会有内存泄漏。

2.自动变量需要被嵌套在服务体函数中的大括号{}包围,大括号需要在调用tpreturn()tpforward() 函数前结束。

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
SERVICE(TPSVCINFO *rqst)
#else
SERVICE(rqst)
TPSVCINFO *rqst;
#endif
{
    string Message;
    ...
    tpreturn(TPFAIL, 0, 0, 0L, 0);
}

可以改为:

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
SERVICE(TPSVCINFO *rqst)
#else
SERVICE(rqst)
TPSVCINFO *rqst;
#endif
{
    do
    {
        string Message;
        ...

    } while(0); 
    tpreturn(TPSUCCESS, 0,NULL, 0L, 0);
}

转载请注明:我是IT » Tuxedo中string导致内存泄漏

喜欢 (0)or分享 (0)