STL库是个伟大的作品,不过,有的时候,它也有一点点小问题。
我写的一个服务器程序,在运行大约8小时候,出现Program received signal SIGSEGV, Segmentation fault.
#1 0x00002adde5c9a853 in _int_free () from /lib64/libc.so.6
#2 0x00002adde5c9a99c in free () from /lib64/libc.so.6
下面一级堆栈是
m_queuefreep->pop();
下面是源码:
- data_t *try_get_free_data()
- {
- boost::mutex::scoped_try_lock lock(m_free_mutex);
- if(!lock.owns_lock())
- {
- return NULL;
- }
-
- if(m_queuefreep->empty())
- {
- return NULL;
- }
- data_t* datap = m_queuefreep->front();
- m_queuefreep->pop();
-
- return datap;
- };
- #include <stdexcept> // for debug purpose
-
- template <typename item, unsigned int qsize>
- class queue {
- public:
- item data[qsize];
- unsigned int rp,wp;
- bool full;
-
- queue(): rp(0),wp(0),full(false) {}
-
- bool empty() { return ((rp == wp) && (!full)); }
-
- unsigned int size() {
- if(!full) return (wp-rp+qsize)%qsize;
- else return qsize;
- }
-
- item& front() {
- if(empty()) throw;
- return data[rp];
- }
-
- item& back() {
- if(empty()) throw;
- return data[(wp-1+qsize)%qsize];
- }
-
- void push(const item dd) {
- if(full) throw;
- data[wp] = dd;
- wp = (wp+1)%qsize;
- if(wp == rp) full = true;
- }
-
- void pop(){
- if(empty()) throw;
- rp = (rp + 1)%qsize;
- full = false;
- }
- };
-
- template <typename item, unsigned int qsize>
- class stack
- {
- public:
- item data[qsize];
- unsigned int p;
- stack(): p(0){}
-
- bool empty() { return (p == 0);}
- unsigned int size() { return p; }
-
- item& top(){
- if(empty()) throw;
- return data[p-1];
- }
- void push(const item dd) {
- if(p==qsize) throw;
- data[p++] = dd;
- }
-
- void pop() {
- if(empty()) throw;
- p--;
- }
- };
原文来自:http://hi.baidu.com/goggle1/blog/item/0ea14befc4675ef7b2fb952a.html
(guoqiang) |