|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:# c- r, K) g4 L9 d/ x$ [
void * MEM_alloc (int n_bytes)
% L+ C; c- W p, Hvoid * MEM_realloc (void *ptr, int n_bytes)- Q0 E2 T1 k3 R+ D5 J9 |
void * MEM_crealloc (void *ptr, int n_items, int item_size)
" u: \) i6 c4 @# Jvoid MEM_free (void *ptr)6 N- j& ^. M2 X5 L! f; T4 i
其对应的C语言内存管理函数分别是:
$ D& C! m: A& Y. c9 b; hvoid *malloc(size_t size)) W1 l5 V/ O# P5 b5 t: r0 T
void *realloc(void *mem_address, unsigned int newsize);
! L- N$ z( D' K }1 X# Cvoid *calloc(unsigned n, unsigned size)/ ?' L/ U4 h/ s J0 i
void free (void *ptr)
/ j8 c$ S# ?- r2 ?顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;, b6 s1 [% ?/ K& p
MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;+ `! T- g G2 y4 `3 ?% C; {
MEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
1 Y5 u6 [! x7 \6 q) n5 A. G9 ?* C8 fMEM_crealloc跟MEM_alloc 的区别:8 i: N9 e4 L; W, Y. G
MEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。+ h4 [) o7 V5 B+ u5 p# k! c J
MEM_free (void *ptr) 释放指针ptr所指内存块。
. |7 _5 `5 ]; `在实际开发过程中,常犯的内存管理错误:/ c ^( M) T. `4 x/ X; V
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
' X4 k: g; Y5 o h$ tconst char* orStr = "abcdef"; Q9 x. ~7 T+ e$ F' t" W' p) D3 u4 e
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));9 f5 O1 a- I! n3 Y: W, V" A( W
strcpy(str,orStr);
% u f9 ]. p5 n" ?3 j在teamcenter中会出现如下异常:- @( V, N0 R# r. f, U5 ^
+++ Invalid trailer (1396785995) found in block &7F030590
) X; n6 j% w$ _正确的做法是
4 q; F# U/ D) ]const char* orStr = "abcdef";
4 F4 Y7 d! J! s, \char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
6 m" T K+ d, L5 G# y1 l% [strcpy(str,orStr);0 O( e( |$ _: a5 M# B3 z
2、MEM_alloc()分配的内存空间被认为是初始化的& u+ D2 F4 h1 y, ^5 {
MEM_alloc()分配的内存空间变量是没有初始化的,
6 W+ r9 }: f* n/ m P" [* ~- u是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。
! F( L* |5 T4 ~通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。" e5 H% M% l+ {) S9 Z7 k) E1 U
3. 未调用free()释放内存6 n9 u3 m3 n4 l' ]
使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。
0 s: W% X0 u% u8 Z0 O2 a0 `5 v, F8 C4 m
|
|