转载

Tuxedo中string导致内存泄漏

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

普通的自动变量(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); } 
原文  http://www.nginx.cn/4376.html
正文到此结束
Loading...