std::map::clear() が呼び出された後もメモリにアクセスできるのはなぜですか? 質問する

std::map::clear() が呼び出された後もメモリにアクセスできるのはなぜですか? 質問する

std::map::clear() の奇妙な動作を観察しています。このメソッドは呼び出されると要素のデストラクタを呼び出すはずですが、clear() の呼び出し後もメモリにアクセスできます。

例えば:

struct A
{
  ~A() { x = 0; }
  int x;
};

int main( void )
{
  std::map< int, A * > my_map;
  A *a = new A();
  a->x = 5;
  my_map.insert( std::make_pair< int, *A >( 0, a ) );

  // addresses will be the same, will print 5
  std::cout << a << " " << my_map[0] << " " << my_map[0]->x << std::endl;

  my_map.clear();

  // will be 0
  std::cout << a->x << std::endl;

  return 0;
}

問題は、変数のデストラクタが map::clear() によって呼び出された後でも、なぜ変数にアクセスできるのかということです。呼び出し後にa書き込む必要がありますか、それとも内容を上書きしても安全ですか?delete a;my_map.clear()a

ご協力ありがとうございます、sneg

ベストアンサー1

マップ(またはリストなど)にポインタを保存する場合あなたマップはポインタが new で作成されたかどうかわからないため、ポインタを削除する責任があります。clear 関数は、ポインタを使用しない場合にのみデストラクタを呼び出します。

ああ、もう 1 つ: デストラクタを呼び出しても (または delete を呼び出しても)、メモリにアクセスできなくなるわけではありません。アクセスするとゴミにアクセスすることになるというだけです。

おすすめ記事