1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| class Foo{ public: Foo() {cout << "Foo::Foo()" << endl;} Foo(int) {cout << "Foo::Foo(int)" << endl;throw bad;}
void* operator new(size_t size){ return malloc(size); } void* operator new(size_t size, void* start){ return start; } void* operator new(size_t size, long extra){ return malloc(size+extra); } void* operator new(size_t size, long extra, char init){ return malloc(size+extra); } private: int m_i; };
template<...> class basic_string{ private: struct Rep{ ... void release() {if(--ref==0) delete this;} inline static void* operator new(size_t, size_t); inline static void operator delete(void*); inline static Rep* create(size_t); ... } };
template<class charT, class traits, class Allocator> inline void* basic_string<charT,traits,Allocator>::Rep::operator new(size_t s, size_t extra){ return Allocator::allocate(s+extra * sizeof(charT)); } template<class charT, class traits, class Allocator> inline void* basic_string<charT,traits,Allocator>::Rep::operator delete(void* ptr){ } template<class charT, class traits, class Allocator> inline basic_string<charT,traits,Allocator>::Rep* basic_string<charT,traits,Allocator>::Rep::create(size_t extra){ extra = frob_size(extra+1); Rep *p = new(extra)Rep; ... return p; }
|