|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:
9 |' W c, A1 Qvoid * MEM_alloc (int n_bytes)
& s' a# V$ ~1 L9 `( hvoid * MEM_realloc (void *ptr, int n_bytes)
& L. {2 H% n+ G! r0 D+ n. {void * MEM_crealloc (void *ptr, int n_items, int item_size)
7 F: t2 c9 J' c7 y& bvoid MEM_free (void *ptr)
4 S/ F# A! d! y c3 \: }$ h其对应的C语言内存管理函数分别是:
+ H5 O' E1 Q( a) E6 y" [! }- u0 tvoid *malloc(size_t size)
8 e* K8 P8 {4 X) D& ^( T1 t0 rvoid *realloc(void *mem_address, unsigned int newsize);
6 _$ D, e- b. M( H, n4 evoid *calloc(unsigned n, unsigned size)8 S# z1 z+ y/ [7 y7 E1 X! M
void free (void *ptr)
; y7 |8 c+ v( R顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;
: b* [& a2 \/ PMEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;
0 `5 G0 a# S4 X/ l" t# B$ {4 v* GMEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.1 d1 l* I) {( A" e, W. K
MEM_crealloc跟MEM_alloc 的区别:$ J0 s% Z& T) ]' } B& i
MEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。
/ c) h! M, N( j7 w0 Q' KMEM_free (void *ptr) 释放指针ptr所指内存块。
% D5 [: t5 J e) Z( U在实际开发过程中,常犯的内存管理错误:( u2 y2 |; }1 t7 v1 c1 C
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出1 _1 X$ N- y- }( u$ ?9 r: a
const char* orStr = "abcdef";
" Y/ E' ?9 y: x9 j. Rchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));
! u7 Z, i3 r0 K! X/ U1 [strcpy(str,orStr);
! `8 f8 p8 H0 `9 {5 n8 h在teamcenter中会出现如下异常:
; I4 Q& c9 c7 j3 n% x" D; ^+++ Invalid trailer (1396785995) found in block &7F030590
0 l }% U1 S0 C: Z0 x正确的做法是, G2 ^, ^7 J0 b
const char* orStr = "abcdef";
7 M" `3 p; ^' d. C2 Wchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
$ Z) U' ?# z2 Z6 W# @% Jstrcpy(str,orStr);
. p3 _, C# Y5 s+ b1 {6 V4 q2、MEM_alloc()分配的内存空间被认为是初始化的$ p N! s. z$ M; p) D
MEM_alloc()分配的内存空间变量是没有初始化的,
' C/ e6 {! u' \4 ~是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。. w$ V7 u; J& X" \
通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。
$ t! k5 A! T Y* D, n; K3. 未调用free()释放内存
4 q z5 _" ~6 u$ Y使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。3 s* y6 O, R; Q
1 K/ O1 L9 `0 i: Q8 @& E) I/ I
|
|