前提・実現したいこと
競プロ用のライブラリのvectorを自作しようとしています。
vectorライブラリを実装中に以下のエラーメッセージが発生しました。
二次元以上のvectorを使えるようにしたいです。
発生している問題・エラーメッセージ
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001384c60 ***
該当のソースコード
c++
1#include <iostream> 2using namespace std; 3 4 5 6namespace ttkkggww 7{ 8 template <typename TYPE> 9 class vector 10 { 11 private: 12 //配列の先頭のポインタ 13 TYPE *array; 14 //確保しているメモリサイズ 15 int capacity; 16 //使っている配列の大きさ 17 int use_capacity; 18 //use_capacityがcapacityに到達したら二倍にメモリを拡張 19 //要素数が増える時に使う 20 void mayextend(); 21 22 public: 23 TYPE operator [](int index) const; 24 TYPE& operator [](int index); 25 TYPE front ()const; 26 TYPE& front(); 27 TYPE back()const; 28 TYPE& back(); 29 30 bool is_valid() const; 31 //末尾に値を追加するO(1) 32 void push_back(TYPE val); 33 //末尾の値を削除するO(1) 34 void pop_back(); 35 //指定した場所の値を追加する。O(size()) 36 void insert(TYPE val,int index); 37 //指定した場所の値を削除する。O(size()) 38 void erase(int index); 39 //配列の長さを返すO(1) 40 int size(); 41 //最初のポインタを返す。O(1) 42 TYPE* pbegin(); 43 //最後の値が入っている次のポインタを返す。O(1) 44 TYPE* pend(); 45 //コンストラクタ 46 vector(); 47 //コンストラクタO(logsize) 48 vector(int insize); 49 //デストラクタO(1)? 50 ~vector(); 51 }; 52 53 template <typename TYPE> 54 inline bool vector<TYPE>::is_valid()const 55 { 56 return array != nullptr; 57 } 58 59 template <typename TYPE> 60 void vector<TYPE>::mayextend() 61 { 62 if(capacity==use_capacity) 63 { 64 TYPE *copy = new TYPE[use_capacity-1]; 65 for(int i=0;i<use_capacity-1;i++) 66 { 67 copy[i]=array[i]; 68 } 69 capacity=capacity<<1; 70 delete[] array; 71 array = new TYPE[capacity]; 72 for(int i=0;i<use_capacity-1;++i) 73 { 74 array[i]=copy[i]; 75 } 76 delete[] copy; 77 } 78 } 79 80 template <typename TYPE> 81 TYPE vector<TYPE>::operator [](int index) const 82 { 83 return array[index]; 84 } 85 86 template <typename TYPE> 87 TYPE& vector<TYPE>::operator [](int index) 88 { 89 return array[index]; 90 } 91 92 template <typename TYPE> 93 TYPE vector<TYPE>::front()const 94 { 95 return array[0]; 96 } 97 98 template <typename TYPE> 99 TYPE& vector<TYPE>::front() 100 { 101 return array[0]; 102 } 103 104 template <typename TYPE> 105 TYPE vector<TYPE>::back()const 106 { 107 return array[use_capacity-1]; 108 } 109 110 template <typename TYPE> 111 TYPE& vector<TYPE>::back() 112 { 113 return array[use_capacity-1]; 114 } 115 116 template <typename TYPE> 117 void vector<TYPE>::push_back(TYPE val) 118 { 119 use_capacity++; 120 mayextend(); 121 array[use_capacity-1]=val; 122 } 123 124 template <typename TYPE> 125 void vector<TYPE>::pop_back() 126 { 127 use_capacity--; 128 } 129 130 template <typename TYPE> 131 void vector<TYPE>::insert(TYPE val,int index) 132 { 133 use_capacity++; 134 mayextend(); 135 //一つ後ろにずらす 136 for(int i=use_capacity-1;i>index;--i) 137 { 138 array[i]=array[i-1]; 139 } 140 array[index]=val; 141 } 142 143 template <typename TYPE> 144 void vector<TYPE>::erase(int index) 145 { 146 use_capacity--; 147 for(int i=index;i<use_capacity;++i) 148 { 149 array[i]=array[i+1]; 150 } 151 } 152 153 template <typename TYPE> 154 int vector<TYPE>::size() 155 { 156 return use_capacity; 157 } 158 159 template <typename TYPE> 160 TYPE* vector<TYPE>::pbegin() 161 { 162 return array; 163 } 164 165 template <typename TYPE> 166 TYPE* vector<TYPE>::pend() 167 { 168 return array+use_capacity+1; 169 } 170 171 template <typename TYPE> 172 vector<TYPE>::vector() 173 { 174 capacity=1; 175 use_capacity=0; 176 array = new TYPE[capacity]; 177 178 } 179 180 template <typename TYPE> 181 vector<TYPE>::vector(int insize) 182 { 183 capacity=1; 184 use_capacity=insize; 185 while(capacity<insize) 186 { 187 capacity=capacity<<1; 188 } 189 array = new TYPE[capacity]; 190 for(int i = 0;i < insize;++i) 191 array[i]=0; 192 } 193 194 template <typename TYPE> 195 vector<TYPE>::~vector() 196 { 197 if(is_valid()==true) 198 { 199 delete[] array; 200 array=nullptr; 201 } 202 } 203} 204 205int main() 206{ 207 int n;cin>>n; 208 ttkkggww::vector<ttkkggww::vector<int>> a(n); 209 return 0; 210}
試したこと
deleteを同じアドレス?に対して二回連続で呼び出しているのだとおもいます。
ロベールのC++Arrayクラステンプレート
このページを参考にしました。
delete後にnullを代入したりしてみました。
補足情報
エラーメッセージはAtCoderのコードテストからのエラーです。
コードテスト
GCC5.4.1
回答4件
あなたの回答
tips
プレビュー