|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:
, ~! [; n$ v. |) z. O& u% nvoid * MEM_alloc (int n_bytes)
2 @0 @/ ~5 t* |/ W$ I2 Ovoid * MEM_realloc (void *ptr, int n_bytes)/ R# g8 d7 c" [% Y" w
void * MEM_crealloc (void *ptr, int n_items, int item_size)
3 p7 h' k+ G" M+ U7 O' c$ [) w9 Nvoid MEM_free (void *ptr)
% r0 M+ D8 X$ y: L0 C其对应的C语言内存管理函数分别是:. o; m5 A" c4 [- J
void *malloc(size_t size)# b% l* t' L3 l' j" L5 M1 c
void *realloc(void *mem_address, unsigned int newsize);
* G" m9 c2 h; t* Qvoid *calloc(unsigned n, unsigned size)
! o0 h/ p! ~! Rvoid free (void *ptr)
; @3 z9 T/ c. `" T, ~顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;
! P; C! Z( }. K, @1 @MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;
[& B4 c( \7 kMEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.0 i0 |( X4 S- ]. D) E9 o9 i
MEM_crealloc跟MEM_alloc 的区别:
# j* x+ D( X0 OMEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。- L7 J* L9 C$ r
MEM_free (void *ptr) 释放指针ptr所指内存块。
3 L: z B8 Z$ A2 Q- Q! t在实际开发过程中,常犯的内存管理错误:4 U2 E8 y) k' v" J* ^, @3 O4 D! F" E+ L [+ r
1、对字符串分配内存未考虑trailer'\0',会出现内存溢出# X" R H+ ~0 ]# z
const char* orStr = "abcdef";) j5 W, O+ G1 \. X! c
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));
% L- l0 K- w3 w' B0 Nstrcpy(str,orStr);
) {. p- Q& T4 g5 _! }在teamcenter中会出现如下异常: x% ?! L- C' B+ A) l% Q2 _# U8 [2 p
+++ Invalid trailer (1396785995) found in block &7F030590
3 [. f# x5 \# ], Z. A正确的做法是) O( n6 i( m1 @2 r/ ~' X5 U/ B( d
const char* orStr = "abcdef";
! ^5 T) F; o1 V" Achar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);
! {; _% q6 ~, _2 ^# r& Zstrcpy(str,orStr);
5 u& {% Z9 p2 V9 Y# }4 s2、MEM_alloc()分配的内存空间被认为是初始化的) k, f4 F1 `- G* y
MEM_alloc()分配的内存空间变量是没有初始化的,
$ N% ^1 y, w3 m/ b# G是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。
. k" H4 g# J7 e! y8 ^8 }) @通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。4 O2 |" W2 {5 n3 f& l$ c
3. 未调用free()释放内存
$ g1 f- |: Z4 G0 K使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。4 b2 k6 Y2 w- y8 H
0 r$ d. D- U% L- Y! h
|
|