B20:bug: static_cast not recognized and possibly? cause of core-dump
paradox@BBHC.ORG
paradox@BBHC.ORG
Mon Mar 6 10:54:00 GMT 2000
Title: B20:bug: static_cast not recognized and possibly? cause of core-dump
system:ÃÂ
ÃÂ WindowsNT 4.0 service pack 5
ÃÂ ÃÂ PIII 550
ÃÂ ÃÂ 128mb ram
ÃÂ ÃÂ
command-line listing:
I:\PROJECTS\core\core_ms_app>gcc -o main.exe main.cxx -I../template -I../factory
..\\template\\core_pool.h: In method `void * ::core::Pool<T>::alloc(size_t)':
In file included from main.cxx:4:
..\\template\\core_pool.h:51: parse error before `::'
..\\template\\core_pool.h:71: parse error before `&'
..\\template\\core_pool.h: In method `void ::core::Pool<T>::free(void *)':
..\\template\\core_pool.h:76: parse error before `;'
..\\template\\core_pool.h: In method `::core::Pool<T>::~Pool()':
..\\template\\core_pool.h:85: parse error before `('
[main] d:\cygnus\CYGWIN~1\H-I586~1\lib\gcc-lib\i586-cygwin32\egcs-2.91.57\cc1plu
s.exe 1002 (0) handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
[main] cc1plus 1002 (1) handle_exceptions: Dumping stack trace to cc1plus.exe.co
re
I:\PROJECTS\core\core_ms_app>gcc -o main.exe main.cxx -I../template -I../factory
..\\template\\core_pool.h: In method `void * ::core::Pool<T>::alloc(size_t)':
In file included from main.cxx:4:
..\\template\\core_pool.h:51: parse error before `::'
..\\template\\core_pool.h:71: parse error before `&'
..\\template\\core_pool.h: In method `void ::core::Pool<T>::free(void *)':
..\\template\\core_pool.h:76: parse error before `;'
..\\template\\core_pool.h: In method `::core::Pool<T>::~Pool()':
..\\template\\core_pool.h:85: parse error before `('
[main] d:\cygnus\CYGWIN~1\H-I586~1\lib\gcc-lib\i586-cygwin32\egcs-2.91.57\cc1plu
s.exe 1002 (0) handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
[main] cc1plus 1002 (0) handle_exceptions: Dumping stack trace to cc1plus.exe.co
re
cc1plus.exe.core:
[main] cc1plus 1002 (0) exception: trapped!
[main] cc1plus 1002 (0) exception: code 0xC0000005 at 0x45FAAD
[main] cc1plus 1002 (0) exception: ax 0x0 bx 0x1F5 cx 0x2EC dx 0x0
[main] cc1plus 1002 (0) exception: si 0x25DF5AC di 0x1 bp 0x25DFD1C sp 0x25DF470
[main] cc1plus 1002 (0) exception: exception is: STATUS_ACCESS_VIOLATION
[main] cc1plus 1002 (0) stack: Stack trace:
[main] cc1plus 1002 (0) stack: frame 0: sp = 0x25DF284, pc = 0x6100A2C3
[main] cc1plus 1002 (0) stack: frame 1: sp = 0x25DF2C0, pc = 0x77F94846
[main] cc1plus 1002 (0) stack: frame 2: sp = 0x25DF2E4, pc = 0x77F89013
[main] cc1plus 1002 (0) stack: frame 3: sp = 0x25DF370, pc = 0x77F76392
[main] cc1plus 1002 (0) stack: frame 4: sp = 0x25DFD1C, pc = 0x48FB85
[main] cc1plus 1002 (0) stack: frame 5: sp = 0x25DFD48, pc = 0x49328B
[main] cc1plus 1002 (0) stack: frame 6: sp = 0x25DFDA0, pc = 0x61004402
[main] cc1plus 1002 (0) stack: frame 7: sp = 0x25DFF88, pc = 0x61004420
[main] cc1plus 1002 (0) stack: frame 8: sp = 0x25DFF94, pc = 0x5B26CE
[main] cc1plus 1002 (0) stack: frame 9: sp = 0x25DFFA4, pc = 0x40103A
[main] cc1plus 1002 (0) stack: frame 10: sp = 0x25DFFC0, pc = 0x77F1BA3C
[main] cc1plus 1002 (0) stack: frame 11: sp = 0x25DFFF0, pc = 0x0
[main] cc1plus 1002 (0) stack: End of stack trace
core_pool.h:
/*************************************
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ (C)opyright 2000 Christopher Nelson, All Rights Reserved
ÃÂ ********/
#ifndef __CoreMemoryPool_header
#define __CoreMemoryPool_header
#include "core_list.h"
/*********************************************************************************************
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ Pool provides an extrememly fast memory allocation scheme for specific objects.ÃÂ It should
ÃÂ be inherited into the object that you want to use it for, or embedded.ÃÂ operators new and
ÃÂ delete are already overridden for you, however if you embed it you will have to override
ÃÂ them akk by yourself.ÃÂ It also may save you quite a bit of memory over
ÃÂ standard new and delete, if your objects are very small.
ÃÂ ÃÂ ÃÂ Pool follows all new and delete conventions.ÃÂ Pool will only allocate objects of the size
ÃÂ that it is optimized to handle.ÃÂ For all other sizes it refers the request to the global new.
ÃÂ *********************************************************************************************/
namespace core {
template<class T>
class Pool
{
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // data structure used for managing pool.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ union pool_struct
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ pool_struct *next;ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ //pointer to next block
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ TÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ object; //reference to object
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ };
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // pointer to head of memory pool
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ pool_struct *head;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // list used to store blocks of allocated memory for cleanup.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ List<pool_struct> blocks;
private:
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ void *alloc(size_t size)
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ pool_struct *tmp;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if (head == 0)
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // allocate and initialize a list of fixed-size blocks
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ union pool_struct *block = static_cast<pool_struct *>::operator new(sizeof(T)*512]),
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ *p;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // save block for cleanup.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ blocks.AddHead(block);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // now link each item together
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ for(i=0; i<512; i++) {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if (i!=511) block[i].next = &block[i+1];ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ //link to next block
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ else block[i].next = 0;ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // set last one to NULL.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ head = block;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // allocate from the pool.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ tmp=head;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ head=head->next;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // here's the memory we wanted
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ return static_cast<void *>&tmp->object;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ void free (void *mem)
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ pool_struct *m = static_cast<pool_struct *>mem;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ m->next = head;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ head=m;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
public:
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ Pool():head(0) {};
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ~Pool() {ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // allows pools to be deallocated
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ListIterator it(blocks.Head()); ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // without causing leaks - we delete
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ while(it()) { ::operator delete(it, sizeof(T)*512); }ÃÂ ÃÂ // each allocated block of memory.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ };
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
public:
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ void *operator new(size_t size)
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if (size != sizeof(T))ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // if size is "wrong,"
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ return ::operator new(size);ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // have standard operator
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // new handle the request
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ else
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ return alloc(size);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ void operator delete(void *mem, size_t size)
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ {
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if (mem==0) return;
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ if (size != sizeof(T)) {ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // if size is "wrong,"
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ::operator delete(mem); ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // have standard operator delete
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ return; ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ // handle the request.
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ free(mem);
ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
};
}; //end core namespace
#endifÃÂ // generated Thu MarÃÂ 2 16:08:14 2000
<<...>>
More information about the Cygwin
mailing list