フリじゃなくてSegmentation faultきらいです(じょしらくにハマってるオタク)。
なんかやけにセグフォールト(セグメンテーションフォールトの略)に出くわしている気がするので、出くわした状況をメモしていこうという記事です。
パターン1: 2次vectorの初期化わすれ
こういうケースです。
#include <vector> using namespace std; int main() { vector<vector<int>> x; x[0][0] = 3; // Segmentation fault return 0; }
解決策はこうです。
#include <vector> using namespace std; int main() { vector<vector<int>> x(1, vector<int>(1)); x[0][0] = 3; // OK x[0][1] = 3; // OK return 0; }
ただし、 この場合 x[1][0] = 3
とするとセグフォールトが起きます。これは以下のどれかで解消できます。
#include <vector> using namespace std; int main() { vector<vector<int>> x1(1, vector<int>(1)); vector<vector<int>> x2(2, vector<int>(1)); // 初期化時点で要素数を増やす vector<vector<int>> x3(1, vector<int>(1)); x1.push_back(vector<int>(1)); // あとから追加する x1[1][0] = 3; x2[1][0] = 3; x3.resize(2); // サイズを変更する x3[1][0] = 3; return 0; }