|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
基于Teamcenter ITK的二次开发是用C来实现的,其内存管理使用C语言的内存管理机制。ITK开发常用内存管理函数:) ?4 |$ d( b( Y% q6 I( n! \0 ~( q
void * MEM_alloc (int n_bytes)
( b" A6 M* r8 Ivoid * MEM_realloc (void *ptr, int n_bytes); G* w1 k. E( T$ R! C& Z
void * MEM_crealloc (void *ptr, int n_items, int item_size)5 M& M5 I# \& x3 G4 S
void MEM_free (void *ptr)/ r; H. }% H2 Z! n" s$ {4 |
其对应的C语言内存管理函数分别是:
/ e. ^" L- c2 Jvoid *malloc(size_t size)
$ G5 f5 V4 A5 }5 l' Xvoid *realloc(void *mem_address, unsigned int newsize);
7 x2 o% s' m7 U; g- Svoid *calloc(unsigned n, unsigned size). R+ i8 n4 } [1 b
void free (void *ptr)9 N& i8 r: D3 j" x4 `1 n! x4 n- x) ]
顾名思义,MEM_alloc (int n_bytes) 分配n_bytes空间内存给变量;
' s; r8 C% D# ~ @6 F" @MEM_realloc (void *ptr, int n_bytes) 分配n_bytes的内存空间给指针变量ptr,通常新空间要比原空间大,否则会丢失数据;
" c+ H9 w$ r2 }4 bMEM_crealloc (void *ptr, int n_items, int item_size) 分配n_items个长度为item_size的连续空间给指针变量ptr.
% u5 O! C- r* Z# Z- HMEM_crealloc跟MEM_alloc 的区别:. l8 u5 N2 r5 q2 H5 ^5 M
MEM_crealloc在动态分配完内存后,自动初始化该内存空间为零,而MEM_alloc不初始化,里边的数据是随机的垃圾数据。
2 H A0 s4 u+ z5 w- VMEM_free (void *ptr) 释放指针ptr所指内存块。
; T3 r' t. [5 x; E7 @ C在实际开发过程中,常犯的内存管理错误:
6 x6 L1 m4 N' |8 v* J/ I1、对字符串分配内存未考虑trailer'\0',会出现内存溢出
5 I" {; ]- R) f3 O3 Econst char* orStr = "abcdef";" {" d# G8 @8 l5 c0 o4 u# m
char* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char));& a1 j* g( b) T* H
strcpy(str,orStr);6 E- p$ E4 q7 G) n. ^* `0 y
在teamcenter中会出现如下异常:
. }" c+ }. C/ b" F8 \( A+++ Invalid trailer (1396785995) found in block &7F0305908 o" M! `! G1 |) C) A. `. W, l) C2 U
正确的做法是0 C5 M/ J9 f( \0 K* q/ i
const char* orStr = "abcdef";
$ S7 I0 [8 |3 Vchar* str = (char*)MEM_alloc(strlen(orStr)*sizeof(char)+1);7 D1 P% c+ p% L: s9 S8 o, C) i! \+ v
strcpy(str,orStr);
" G) t% E9 C# x' q- \9 Z9 c! s' a2、MEM_alloc()分配的内存空间被认为是初始化的
5 ~1 U3 _ O9 D9 O, K( _MEM_alloc()分配的内存空间变量是没有初始化的,2 _+ D+ `0 R, b9 v- L$ ^
是随机的垃圾数据,但该变量是有长度的,如果我们以该变量的长度来判断该变量是否被有效赋值,显然是不正确的。3 h4 Y, `* K) E
通常的办法是用memset给变量空间初始化为'\0',如memset(a,'\0',sizeof(a)),初始化后的变量长度为零。因而可用长度大于0来判定是否已经被有效赋值。9 J4 ]0 [9 ]- `" J% t, g r) t% Z
3. 未调用free()释放内存, n6 x; Q: g; m% G
使用MEM_alloc或MEM_realloc或MEM_crealloc分配内存给变量后,在程序末端需要及时调用free()释放内存,否则会引起内存泄露。, D" @2 R" }4 ?9 o1 @8 p. g/ x) G7 m
8 o# q- }8 x+ K4 E. p
|
|