Ignore:
Timestamp:
Apr 30, 2011, 12:24:57 AM (11 years ago)
Author:
Sam Hocevar
Message:

lisp: fix a memory leak in the grow stack objets and refactor the class.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/lisp/stack.h

    r555 r561  
    1616
    1717// A fixed-size stack class
    18 template<class T> class grow_stack
     18template<class T> class GrowStack
    1919{
    2020public:
    21     T **sdata;
    22     long son;
     21    GrowStack(int max_size)
     22    {
     23        m_max_size = max_size;
     24        m_size = 0;
     25        sdata = (T **)malloc(sizeof(T *) * m_max_size);
     26    }
    2327
    24 private:
    25     long smax;
    26 
    27 public:
    28     grow_stack(int max_size)
     28    ~GrowStack()
    2929    {
    30         smax = max_size;
    31         son = 0;
    32         sdata = (T **)malloc(sizeof(T *) * smax);
     30        if (m_size != 0)
     31            fprintf(stderr, "warning: cleaning up nonempty stack\n");
     32        free(sdata);
    3333    }
    3434
    3535    void push(T *data)
    3636    {
    37         if(son >= smax)
     37        if (m_size >= m_max_size)
    3838        {
    39             lbreak("error: stack overflow (%ld >= %ld)\n", son, smax);
     39            lbreak("error: stack overflow (%d >= %d)\n",
     40                   (int)m_size, (int)m_max_size);
    4041            exit(1);
    4142        }
    42         sdata[son] = data;
    43         son++;
     43        sdata[m_size] = data;
     44        m_size++;
    4445    }
    4546
    46     T *pop(long total)
     47    T *pop(size_t total)
    4748    {
    48         if (total > son)
     49        if (total > m_size)
    4950        {
    5051            lbreak("error: stack underflow\n");
    5152            exit(1);
    5253        }
    53         son -= total;
    54         return sdata[son];
     54        m_size -= total;
     55        return sdata[m_size];
    5556    }
    5657
    57     void clean_up()
    58     {
    59         if(son != 0)
    60             fprintf(stderr, "warning: cleaning up stack and not empty\n");
    61         free(sdata);
    62         sdata = NULL;
    63         son = 0;
    64     }
     58public:
     59    T **sdata;
     60    size_t m_size;
     61
     62private:
     63    size_t m_max_size;
    6564};
    6665
    6766#endif
     67
Note: See TracChangeset for help on using the changeset viewer.