vectorの2次元配列をポインタにする

正しいんだろうか…?

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
  vector< vector<int>* >* pvv;
  pvv = new vector< vector<int>* >();
  pvv->push_back(new vector<int>(4));
  pvv->push_back(new vector<int>(4));
  pvv->push_back(new vector<int>(4));

  /* ↓だと各列が同じポインタを参照してしまう。
  vector< vector<int>* >* pvv;
  pvv = new vector< vector<int>* >(3, new vector<int>(4));
  // スタックに確保したときにうまくいくのはコピーされるから?
  */

  /* ↓だとスタックにメモリが確保される気が…
  vector< vector<int> >* pvv;
  pvv = new vector< vector<int> >(3, vector<int>(4));
  */

  pvv->at(0)->at(0) = 100;
  pvv->at(0)->at(1) = 101;
  pvv->at(0)->at(2) = 102;
  pvv->at(0)->at(3) = 103;
  pvv->at(1)->at(0) = 110;
  pvv->at(1)->at(1) = 111;
  pvv->at(1)->at(2) = 112;
  pvv->at(1)->at(3) = 113;
  pvv->at(2)->at(0) = 120;
  pvv->at(2)->at(1) = 121;
  pvv->at(2)->at(2) = 122;
  pvv->at(2)->at(3) = 123;

  for (vector< vector<int>* >::iterator i = pvv->begin(); i != pvv->end(); i++) {
    for (vector<int>::iterator j = (*i)->begin(); j != (*i)->end(); j++) {
      cout << *j << endl;
    }
  }

  for (vector< vector<int>* >::iterator i = pvv->begin(); i != pvv->end(); i++) {
    vector<int>* v = *i;
    delete v;
  }

  delete pvv;

  return 0;
}

2次元配列を使うときのベストプラクティスが知りたいなー。

追記
普通に↓の様にすればいいような気がしてきた。

  vector< vector<int> >* pvv;
  pvv = new vector< vector<int> >(3, vector<int>(4));

内部のvectorは別にnewする必要は無いよなー、たぶん。