HTK内存分配处理中的问题

HTK做了自己的内存管理相关函数(hmem.c),并做了一些基础的内存分配函数,在HTK代码中被使用。
一般分配内存采用 Prt New(MemHeap *x, int size);
一般释放数据采用 Dispose(MemHeap *x, Ptr p);
比如创建向量数组ShortVec CreateShortVec(MemHeap *x,int size);等,数组下标从1开始。
创建矩阵Matrix CreateMatrix(MemHeap *x,int nrows,int ncols);等
释放数据 void FreeShortVec(MemHeap *x, ShortVec v); 等

在实际使用中,当MemHeap为不同类型时,使用的规则也不相同。
HTK内部很多地方使用的是 MSTAK 类型的MemHeap,遵循先进后出的方式使用。

  1.    ShortVec vec0 = CreateShortVec(mem, 20);
  2.    ShortVec vec1 = CreateShortVec(mem, 40);
  3.    …
  4.    FreeShortVec(mem, vec0);
  5.    FreeShortVec(mem, vec1);

这段代码在运行后会不正常,原因在于vec0,vec1释放的顺序不对,按照先进后出原则vec0是先创建的应该在vec1释放后被释放。修改为下面的代码执行正确。

  1.    ShortVec vec0 = CreateShortVec(mem, 20);
  2.    ShortVec vec1 = CreateShortVec(mem, 40);
  3.    …
  4.    FreeShortVec(mem, vec1);
  5.    FreeShortVec(mem, vec0);

Popularity: 3% [?]

Related