|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:& s5 d0 X" m8 M4 |) X
void * MEM_alloc (int n_bytes)
/ A d, D+ I) S# d" k% `) Avoid * MEM_realloc (void *ptr, int n_bytes)
0 {; u$ U5 w, R; H2 i G" ^void * MEM_crealloc (void *ptr, int n_items, int item_size) e6 Q3 t- l- a3 B W0 K! }
void MEM_free (void *ptr)
; g" R2 R2 z& x2 P" B其对应的C语言内存管理函数分别是:
% ^, K2 K2 {: v3 g% H* S, R- }: Evoid *malloc(size_t size) d7 Q% y) ?+ Z' l; u! o, y& O+ r
void *realloc(void *mem_address, unsigned int newsize); V$ |4 H( V/ J+ F# z9 w8 K1 f
void *calloc(unsigned n, unsigned size)
/ g6 U. D% x3 S/ ^. c, R1 u- x( m4 xvoid free (void *ptr)/ N) b& P3 Y% z0 s+ V% W1 K
顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;
0 m: |) K# d1 l% K0 {MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;0 z" r+ K0 O4 F# _5 k4 L
MEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
0 d5 H5 N# j) Y" r: Z8 w$ DMEM_crealloc跟MEM_alloc 的区别:+ I4 L5 V$ @; _9 a8 u; S; e, |4 N
MEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。
' D2 k. y: p+ u3 B% Z9 ]- `MEM_free (void *ptr) 释放指针ptr所指内存块。
; ?- d8 r+ ~! q0 q3 G8 {$ I! `在实际开发过程中,常犯的内存管理错误:( ]+ K$ }; U( K. D1 O* o3 w- l
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
: k7 k3 |4 u# `const char* orStr = "abcdef";
6 |7 `% W5 Z' l" N- `, _8 vchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));- Y% m4 I+ @4 ]; m3 F
strcpy(str,orStr);
- X( e/ w' p9 l: i: Z: v$ A在teamcenter中会出现如下异常:
$ S) I4 W) r4 P3 l+++ Invalid trailer (1396785995) found in block &7F030590
4 N7 h3 }) J) m6 V正确的做法是" s) [' v2 J4 C6 Z5 h( P2 E2 F
const char* orStr = "abcdef";
) {! f6 {5 c6 ~4 Ichar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
( w" z2 Q+ E; k0 Jstrcpy(str,orStr);
- i7 l' b) ~, `- c, G2、MEM_alloc()分配的内存空间被认为是初始化的
6 p. W* V- s# Y7 ?. Y7 eMEM_alloc()分配的内存空间变量是没有初始化的,
1 m8 F, y( o) n2 B2 I! X% r4 q6 ?是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。$ S0 i' k T0 ]/ I) y% n
通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。# a+ q: q9 u! H- `% A" c
3. 未调用free()释放内存! V! y. l; G/ W8 s) R2 c8 [) C) j
使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。0 u4 S2 `5 X+ Q' a
! }7 H/ A7 v' S6 w
|
|