|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:
1 y! y: T! \- |6 H* _5 k9 s+ vvoid * MEM_alloc (int n_bytes)
+ t7 W5 l) n5 }% {/ zvoid * MEM_realloc (void *ptr, int n_bytes)6 \( \; b1 z' d0 o6 N
void * MEM_crealloc (void *ptr, int n_items, int item_size)
; Y/ V4 e+ s7 q1 F5 j! j$ |# kvoid MEM_free (void *ptr)
) y) }: U$ f5 U9 N2 K% _4 `其对应的C语言内存管理函数分别是:
% F" x4 Q, ?4 B' {. u9 V6 cvoid *malloc(size_t size)% t* d c+ ]1 y5 s% j( H
void *realloc(void *mem_address, unsigned int newsize);
0 K1 S, m, p$ `7 P Wvoid *calloc(unsigned n, unsigned size)
9 d- x5 e5 g2 G! X- z/ F; C0 @void free (void *ptr)
' {1 ^" `: i: Z/ k3 {+ V+ Q- x$ H顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;
3 m1 F- Y( {- p- c( oMEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;
- d7 D6 |* A2 CMEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.1 z9 e5 J1 n2 V6 q) Z
MEM_crealloc跟MEM_alloc 的区别:
4 f/ m# k3 S9 B& |' z3 yMEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。8 U$ X/ _# w6 F# T, Q! P/ y6 f
MEM_free (void *ptr) 释放指针ptr所指内存块。# Z# p2 J4 [ {* N& {: q
在实际开发过程中,常犯的内存管理错误:
) ?) { P& Y# j* f* O# s1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
9 P1 w, m! Y7 D% ?' bconst char* orStr = "abcdef";" `7 p3 M. G* u( e
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));
1 x' j8 f/ a* C9 H5 r9 Bstrcpy(str,orStr);
" h+ X6 G. A |" h/ A5 m& ]: ]在teamcenter中会出现如下异常:
1 t. T+ S! ~3 |5 m% }$ p, G# o+++ Invalid trailer (1396785995) found in block &7F0305900 P+ x8 M" P/ z( E5 c4 q7 r$ U
正确的做法是
$ G- L5 X" G) c: K( _5 xconst char* orStr = "abcdef";
z+ a9 Q5 q x$ }5 vchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);$ T1 ~3 _, s, J: K3 _
strcpy(str,orStr);
. F% i- ?0 `2 h+ R3 P2、MEM_alloc()分配的内存空间被认为是初始化的
6 a' V( `2 e+ `; c- v5 AMEM_alloc()分配的内存空间变量是没有初始化的," z8 x, M5 T. [1 X9 G5 I
是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。
% r2 j7 h6 o0 Z1 ?9 s& E" |0 n) D通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。 Z) q( h0 W9 K* j
3. 未调用free()释放内存9 ~: V, J! }7 |
使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。* G$ y( G2 f2 k# M) ~$ ?
$ l) R( e4 E. J# m5 v h% C9 K |
|