|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:
! S3 S( D5 U+ {) V2 Kvoid * MEM_alloc (int n_bytes)+ N/ H+ ~- {4 y- u
void * MEM_realloc (void *ptr, int n_bytes). o# y4 E3 G/ i# r+ ]2 C
void * MEM_crealloc (void *ptr, int n_items, int item_size) Q4 C. T# I( ]* S- H9 a3 ]
void MEM_free (void *ptr)
/ z P+ O/ Z. ^% r其对应的C语言内存管理函数分别是: w& B1 \6 e3 ^) W; W1 g" L
void *malloc(size_t size)- b4 L. f. X ^' s+ A3 f
void *realloc(void *mem_address, unsigned int newsize);
' O, f( i0 u% O4 U) wvoid *calloc(unsigned n, unsigned size)
' [/ s; J& U/ T6 l% N3 vvoid free (void *ptr) R. |1 W( Z/ ^: B
顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;( u" m, k6 d |
MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;# H" W a9 P7 `" ^, i
MEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
8 g) v$ E8 Z# n( u5 Q$ o! I' QMEM_crealloc跟MEM_alloc 的区别:
0 t! L8 [/ i) y1 aMEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。
0 ]$ ~9 L. L( R( S+ g* B) RMEM_free (void *ptr) 释放指针ptr所指内存块。& P3 s8 _+ H0 U' z6 B6 m. N8 Z
在实际开发过程中,常犯的内存管理错误:* u f& N4 W9 {* ]. Y- |1 k: ?
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
0 b* J$ y6 t ^' Q/ E/ q7 A4 F& Sconst char* orStr = "abcdef";6 Q+ {, k# s* Z+ C+ a4 j
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));+ a' V4 Q9 I; B) f2 f2 ]$ v
strcpy(str,orStr);& \) U" X8 R. Y w- M, [
在teamcenter中会出现如下异常:4 b0 q) R5 D' z! ]/ x6 A
+++ Invalid trailer (1396785995) found in block &7F030590
8 B" \& E. I* n# t. \( u g2 ?正确的做法是& @* \( R3 ^% f4 ]
const char* orStr = "abcdef";
- X" c9 J: m& `% Y- g/ I; |& n/ ichar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
* z$ {- v, ^9 B5 S7 wstrcpy(str,orStr);
: ~/ f l; R. w. r) E" `/ a2、MEM_alloc()分配的内存空间被认为是初始化的
/ }, J% i, x" g9 x7 z1 PMEM_alloc()分配的内存空间变量是没有初始化的,
+ }$ ?& w/ |3 s# s3 Z8 n是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。
- l5 _& J" C. B' l; P: y( |' d通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。5 C% w' Z$ [7 I/ S! X% {
3. 未调用free()释放内存
- V T; o$ R t0 G使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。9 s: g; A4 m# r
) w* u3 h, H+ t1 ]) T8 H+ Y |
|