存储管理
C++ 对象通常存储在堆栈或堆上。 当堆栈上的对象超出作用域时,将自动销毁这些对象,但不会销毁堆上的对象。 CICS Foundation Classes 在内部创建的许多对象是在堆而不是堆栈上创建的。 这可能会在某些 CICS 服务器环境中导致问题。
CICS® Transaction Server for z/OS®、 CICS 和 Language Environment 管理所有任务存储,以便在任务终止(正常或异常)时释放存储。
在 CICS for AIX 环境中,在任务终止时不会自动释放堆上分配的存储器。 如果应用程序员忘记显式删除堆上的对象,或者更严重的是,如果任务异常终止,那么这可能会导致 "内存泄漏"。
通过在基本基础类 IccBase中提供运算符 new 和 delete ,已在 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) 。