存储管理

C++ 对象通常存储在堆栈或堆上。 当堆栈上的对象超出作用域时,将自动销毁这些对象,但不会销毁堆上的对象。 CICS Foundation Classes 在内部创建的许多对象是在堆而不是堆栈上创建的。 这可能会在某些 CICS 服务器环境中导致问题。

CICS® Transaction Server for z/OS®、 CICS 和 Language Environment 管理所有任务存储,以便在任务终止(正常或异常)时释放存储。

在 CICS for AIX 环境中,在任务终止时不会自动释放堆上分配的存储器。 如果应用程序员忘记显式删除堆上的对象,或者更严重的是,如果任务异常终止,那么这可能会导致 "内存泄漏"。

通过在基本基础类 IccBase中提供运算符 newdelete ,已在 CICS 基础类中解决此问题。 这些可配置为将动态存储器分配请求映射到 CICS 任务存储器,以便在任务终止时自动释放 所有 存储器。 此方法的缺点是性能受到影响,因为基础类通常发出大量小型存储器分配请求,而不是发出单个更大的分配请求。

该功能受 Icc::initializeEnvironment影响,必须在使用基础类之前发出该调用。 (此函数是从缺省 main 函数调用的; 请参阅 CICS C++ 主函数 。)

传递到 initializeEnvironment 函数的第一个参数是一个枚举,它采用以下三个值之一:
cmmDefault
缺省操作是依赖于平台的操作:
z/OS
与 'cmmNonCICS' 相同——参见 'cmmNonCICS' 部分。
UNIX
与 'cmmCICS' 相同——参见 'cmmCICS' 部分。
cmmNonCICS
IccBase 中的 删除 运算符将动态存储器分配请求映射到 CICS 任务存储器; 而是调用 C++ 缺省 删除 运算符。
cmmCICS
IccBase 中的 删除 操作程序将动态存储器分配请求映射到 CICS 任务存储器 (在正常或异常任务终止时自动释放)。
基础类提供的默认主函数以枚举 'cmmDefault' 调用 initializeEnvironment。 您可以在程序中更改此值,而不更改提供的 "头文件" ICCMAIN ,如下所示:
#define ICC_CLASS_MEMORY_MGMT Icc::cmmNonCICS
#include "iccmain.hpp"

或者,在编译时设置选项 DEV (ICC_CLASS_MEMORY_MGMT)