|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:3 P) N; T5 d3 O' f3 Y' M- p
void * MEM_alloc (int n_bytes)& g. a# h& n3 ]& h
void * MEM_realloc (void *ptr, int n_bytes)
" z( }% R( F1 L3 l$ s/ j6 Wvoid * MEM_crealloc (void *ptr, int n_items, int item_size)
4 B* u; x8 J0 U0 D! N/ Ovoid MEM_free (void *ptr). ]& i2 F& ] p: o0 `( O- ^2 t0 |5 @& x
其对应的C语言内存管理函数分别是:
7 Z6 w+ ~3 z$ a) i! J- Uvoid *malloc(size_t size)
$ H7 [% O" z: l3 | `: W/ Zvoid *realloc(void *mem_address, unsigned int newsize);
: X8 ?& K% V; ~+ }! Nvoid *calloc(unsigned n, unsigned size)/ o! _, \! J( ?: a+ E4 I6 m# k8 D
void free (void *ptr)
K, [9 k: t+ g2 D顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;3 `* X( }# \" E9 [0 U4 ^
MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;5 `* i( H. t" r. A# N+ V+ [
MEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
4 M- a% Z5 T3 b8 s( d, PMEM_crealloc跟MEM_alloc 的区别:2 j! w( M" h' t. _2 U' q
MEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。! u' I+ \' a( S/ G# w6 @
MEM_free (void *ptr) 释放指针ptr所指内存块。# S' q" j% @$ ?: }
在实际开发过程中,常犯的内存管理错误:
# I' U. x1 S1 w1 h1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
3 X/ D' X- \+ j. p& Hconst char* orStr = "abcdef";+ {4 w) a- m# j7 Y: X
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));
* z; h; ]7 |' Y* }1 `% X$ jstrcpy(str,orStr);
" a' j; c; @) N7 g在teamcenter中会出现如下异常:
* P" |5 ~; h6 ^% O+++ Invalid trailer (1396785995) found in block &7F030590
% R7 W1 P8 u5 n9 W% S4 A正确的做法是$ G* |' d9 a, m L" z& o, p' L
const char* orStr = "abcdef";* `. q- u/ E' V! H6 O8 L; W
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);( i2 [2 c+ W1 f, V" X1 l# j w
strcpy(str,orStr);
. A; a, Z' W# u# ~2、MEM_alloc()分配的内存空间被认为是初始化的* O5 I- ^$ `8 t! c6 I
MEM_alloc()分配的内存空间变量是没有初始化的,
* b* }- o/ r; ^- v. t是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。
7 O8 W) s' Y7 O$ J通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。! G( R- [3 t1 l0 R
3. 未调用free()释放内存) a0 _' X, \; M7 m
使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。+ f# n* _% E% u8 h/ |
/ B% m; p; V$ I) x6 {& h- u3 N |
|