|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:" d# N% l4 y2 D. i. x- v
void * MEM_alloc (int n_bytes)0 D- F& y' }% \: x( t
void * MEM_realloc (void *ptr, int n_bytes)
6 J. ?' J2 [7 x2 bvoid * MEM_crealloc (void *ptr, int n_items, int item_size)
2 ?! O+ N; q7 ?8 |void MEM_free (void *ptr)
1 R1 k) p/ D% b% g- Q" b( y其对应的C语言内存管理函数分别是:
' I0 f4 l- Q" fvoid *malloc(size_t size)) [8 Z& x9 B( s9 B
void *realloc(void *mem_address, unsigned int newsize);- q( n: Q# d2 B3 T* L' L7 B
void *calloc(unsigned n, unsigned size)% v. C6 {: I' ^$ u% l
void free (void *ptr)
& w, w0 q( d8 p2 z9 E4 K1 G顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;( Q; n: g5 C3 P8 \5 n
MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;# x: T" F* |) X# S7 Q1 O w8 ]2 n
MEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
; |- z3 a+ u+ k! |7 OMEM_crealloc跟MEM_alloc 的区别:
' x5 a0 z8 ^. m4 ^; GMEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。" c! b" H, j% n/ V9 q( l
MEM_free (void *ptr) 释放指针ptr所指内存块。
& B* z2 H' a% u l; q* G在实际开发过程中,常犯的内存管理错误:6 H, y$ V$ U6 E6 m& ?
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出; i' `( J' ^6 |
const char* orStr = "abcdef";
" }0 V6 U- e1 v# {: c3 S% } J( tchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));% `) X& H% |5 U5 t: Z9 L/ O2 H
strcpy(str,orStr);
3 A0 o9 g7 V5 H5 ] d* e在teamcenter中会出现如下异常:
5 P8 M5 ?; m7 Q+++ Invalid trailer (1396785995) found in block &7F030590
9 d8 L" Z# F. Z3 [! a正确的做法是! B8 n' f; N0 ]* p) y8 y: ^
const char* orStr = "abcdef";; {( d+ y2 _0 R0 [( b3 m8 j. N
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
! H! C0 L; T- @; B' _* V5 y& zstrcpy(str,orStr);" C' r R8 \$ S$ e4 u7 u
2、MEM_alloc()分配的内存空间被认为是初始化的# W' H; f6 L) @' j6 ~" }( x
MEM_alloc()分配的内存空间变量是没有初始化的,
0 \7 a* _6 e. R% i% \是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。6 d: D9 `/ R3 {' v- v
通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。
3 X+ P7 m: m( G$ |) `5 K) l3. 未调用free()释放内存6 z) M; E0 W7 y7 ?
使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。. @4 k4 w h! X2 t1 c2 T# d, j
/ |7 Q; I: ~/ _. t$ S5 n& ?
|
|