fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5. template <class T>
  6. class A
  7. {
  8. public:
  9. bool allocated;
  10. typedef T value_type;
  11. typedef T* pointer;
  12. typedef const T* const_pointer;
  13. typedef T& reference;
  14. typedef const T& const_reference;
  15. typedef std::size_t size_type;
  16.  
  17. A() throw()
  18. {
  19. allocated = false;
  20. }
  21.  
  22. pointer allocate (size_type num, const void* = 0)
  23. {
  24. cout << "Allocating " << num << '\n';
  25. allocated = true;
  26. return (pointer)(::operator new(num * sizeof(T)));
  27. }
  28.  
  29. void construct (pointer p, const T& value)
  30. {
  31. cout << "Value: " << value << '\n';
  32. new((void*)p)T(value);
  33. }
  34.  
  35. void destroy (pointer p)
  36. {
  37. cout << "Destroing: " << p << '\n';
  38. if(!allocated) delete *p;
  39. p->~T();
  40. }
  41.  
  42. void deallocate (pointer p, size_type num)
  43. {
  44. cout << "Dealocating\n";
  45. ::operator delete(p);
  46. allocated = false;
  47. }
  48. };
  49.  
  50. class Type
  51. {
  52. public:
  53. int a;
  54. Type()
  55. {
  56. cout << "Ctor " << this << "\n";
  57. }
  58. ~Type()
  59. {
  60. cout << "Dtor " << this << "\n";
  61. }
  62. };
  63.  
  64. int main()
  65. {
  66. std::vector<Type*, A<Type*> > v;
  67.  
  68. v.push_back(new Type());
  69. v.push_back(new Type());
  70. v.push_back(new Type());
  71. v.push_back(new Type());
  72. v.push_back(new Type());
  73. v.push_back(new Type());
  74. cout << '\n';
  75. for(int i = 0; i<6;++i)
  76. {
  77. cout << "Object " << v[i] << " at " << &(v[i]) << '\n';
  78. }
  79. /*v.erase(v.begin());
  80.   v.erase(v.begin());
  81.   v.erase(v.begin());*/
  82. v.erase(v.begin());
  83. cout << '\n';
  84. for(int i = 0; i<5;++i)
  85. {
  86. cout << "Object " << v[i] << " at " << &(v[i]) << '\n';
  87. }
  88. v.clear();
  89. }
  90.  
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
Ctor 0x89d4008
Allocating 1
Value: 0x89d4008
Ctor 0x89d4028
Allocating 2
Value: 0x89d4028
Value: 0x89d4008
Destroing: 0x89d4018
Dealocating
Ctor 0x89d4018
Allocating 4
Value: 0x89d4018
Value: 0x89d4008
Value: 0x89d4028
Destroing: 0x89d4038
Destroing: 0x89d403c
Dealocating
Ctor 0x89d4038
Value: 0x89d4038
Ctor 0x89d4060
Allocating 8
Value: 0x89d4060
Value: 0x89d4008
Value: 0x89d4028
Value: 0x89d4018
Value: 0x89d4038
Destroing: 0x89d4048
Destroing: 0x89d404c
Destroing: 0x89d4050
Destroing: 0x89d4054
Dealocating
Ctor 0x89d4098
Value: 0x89d4098

Object 0x89d4008 at 0x89d4070
Object 0x89d4028 at 0x89d4074
Object 0x89d4018 at 0x89d4078
Object 0x89d4038 at 0x89d407c
Object 0x89d4060 at 0x89d4080
Object 0x89d4098 at 0x89d4084
Destroing: 0x89d4084
Dtor 0x89d4098

Object 0x89d4028 at 0x89d4070
Object 0x89d4018 at 0x89d4074
Object 0x89d4038 at 0x89d4078
Object 0x89d4060 at 0x89d407c
Object 0x89d4098 at 0x89d4080
Destroing: 0x89d4070
Dtor 0x89d4028
Destroing: 0x89d4074
Dtor 0x89d4018
Destroing: 0x89d4078
Dtor 0x89d4038
Destroing: 0x89d407c
Dtor 0x89d4060
Destroing: 0x89d4080
Dtor 0x89d4098
Dealocating