|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:
% m' x) ]$ R! x/ t% o; J# Ovoid * MEM_alloc (int n_bytes)
1 j1 I7 S3 l+ U2 ~void * MEM_realloc (void *ptr, int n_bytes)
3 {2 }9 j& n |- p+ w" Wvoid * MEM_crealloc (void *ptr, int n_items, int item_size)0 u! a7 C; _5 x3 z
void MEM_free (void *ptr). j' X; e0 B* k) l) G
其对应的C语言内存管理函数分别是:) E( ]; u+ o1 F6 v; X
void *malloc(size_t size)$ Y3 X. @% k# I
void *realloc(void *mem_address, unsigned int newsize);
6 S9 @4 i6 F0 P1 D* Gvoid *calloc(unsigned n, unsigned size)+ J C, f" g& R' Q
void free (void *ptr)) e" Q2 W; v' @: g
顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;
: G0 h. {0 z. F5 U, bMEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;2 X: ~% r! f/ G% _7 ]
MEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
: p6 E5 z+ h0 H6 K/ ]: k W) C" FMEM_crealloc跟MEM_alloc 的区别:2 Q w$ i2 l: i0 | M0 k+ ~
MEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。" @( n0 P. X- h1 V
MEM_free (void *ptr) 释放指针ptr所指内存块。0 ?( t. F1 y3 B& X
在实际开发过程中,常犯的内存管理错误:/ e3 I% h3 Q: I6 T0 h% I
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
1 Q4 P2 k9 d7 bconst char* orStr = "abcdef";
r+ j, S$ d& V' b8 _/ w) Qchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));. ^* A9 |+ a3 ~3 y; w* \3 ?
strcpy(str,orStr);
( K6 D" `' g7 p6 W) A3 m" M5 r2 l在teamcenter中会出现如下异常:
; O8 A% G: M9 a3 P* ~3 i7 b* Y' B+++ Invalid trailer (1396785995) found in block &7F030590
) f1 ~& W% P& i: X6 w正确的做法是
- e# u$ x( D2 ~0 ^const char* orStr = "abcdef";1 U" ^! z/ k' R( [ [3 R' M6 C
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
' _% Z& W6 ]4 _( L+ i4 T3 hstrcpy(str,orStr);
* g$ P2 o/ E5 M( s& H4 h7 m0 u2、MEM_alloc()分配的内存空间被认为是初始化的
8 j% D4 d w, o# pMEM_alloc()分配的内存空间变量是没有初始化的,
( r: m1 |. V W6 ?是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。7 M. a3 i( E" k* @
通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。7 Q3 ^$ J/ o8 f* o& `
3. 未调用free()释放内存
# W: ?& ]) v0 A使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。
7 Y0 s7 K7 I5 U3 w- L) x
2 G( E6 [& D E% I |
|