2012-01-07 48 views
-3

使用此代码,我得到一个堆栈溢出错误,如果我使用head=0它要求新的操作符。StackOverflowException未处理

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) 
    {  // try to allocate size bytes 
    void *p; 
    while ((p = malloc(size)) == 0) 
      if (_callnewh(size) == 0) 
      {  // report no memory 
      static const std::bad_alloc nomem; 
      _RAISE(nomem); 
      } 
    return (p); 
    } 



    #include "StdAfx.h" 
    #include "event.h" 


    EventList::EventList() 
     { 
     size = 0; 
     EventList *head = new EventList(); 
     tail = NULL; 


    } 


    EventList::~EventList() 
    { 
    //Do nothing 
    } 

    unsigned int EventList::Size() 
     { 
     return size; 
     } 

    void EventList :: add(Event* ev) 
    /*the event will be added to the correct location based on its time 
     So, always the event at the top (or at location 0) is the most 
     imminent event that must be handled firstly*/ 

     if(size == 0) 
      { 
      head = tail = ev; 
      ev->next = ev->previous = 0; 
      } 
     else 
      { 
      if(ev->eventTime < head->eventTime) 
      { 
      /////////////// 
      ev -> next = head; 
      head -> previous = ev; 
      ev -> previous = 0 ; 
      head = ev; 
      /////////////// 
      } 
     else 
      { 
      //////////// 
      Event* tracer = head; 
      while (tracer -> next != 0) 
       { 
       if (ev -> eventTime >= tracer -> eventTime) 
        { 
        tracer = tracer -> next; 
        } 
       else 
        { 
        ev -> next = tracer; 
        ev -> previous = tracer -> previous; 
        tracer -> previous -> next = ev; 
        tracer -> previous = ev ;       
        } 
       } 
       ////////////// 
       if (tracer -> next == 0) 
        { 
        ev -> next = 0 ; 
        ev -> previous = tracer ; 
        tracer -> next = ev; 
        tail = ev; 
        } 
       //////////// 
      } 
     } 
     size++; 
    } 
    //Remove the most imminent event from the event list to be handled 
    //by the simulator 
    //Since we have an ordered linked list this event is found at the head 
    //of the event list 
    //The retreived event will be found in ev 
    bool EventList :: remove(Event* ev) 
    { 
    /*public ev =new EventList();*/ 
    if(size == 0) 
     { 
     ev = 0; 
     return false; 
     } 
    else 
     { 
     ev =head;  
     //head=ev; 
     if (size != 1) 
      { 
      //head -> next -> previous = 0; 
      head = head -> next ; 
      ev -> next = ev -> previous = 0; 
      } 
     else 
      { 
      head = tail = 0; 
      } 
     return true; 
     } 
    delete head; 
    head=NULL; 
    } 
+2

你学到了什么时你在调试器中遍历你的代码? – 2012-01-07 03:35:23

+1

为什么要更换新的操作员?为什么在包含预编译头文件之前有代码?为什么你不使用C++标准库容器中的一个作为你的列表? – 2012-01-07 03:48:24

回答

4
EventList::EventList() 
{ 
    // ... 
    EventList *head = new EventList(); 
    // ... 
} 

EventList构造,它开始构建另一EventList。由于您不会终止递归,因此最终会耗尽堆栈空间。

(即使你终止了递归,你会泄露所有youv'e创建这些EventList的对象,因为你不指针把它们存放到构造之外。)

+0

如果我使用head = 0;它给我的错误对象引用没有设置使用new来创建对象引用。 – snasr 2012-01-07 11:16:48

+0

这将是你最好的[一本好的入门C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – 2012-01-07 18:34:16

+0

我知道它也有一些错误和错误,但我想我的模型的最佳解决方案...在此先感谢 – snasr 2012-01-08 07:36:26