珍しくC++のコードを書いていたら次のようなコードを書いてはまった。

#include <map>
#include <iostream>
using namespace std;
struct A{
  int size;
  A(int s) : size(s){}
};
map<char , A*> m;
void f(){
  A a(3);
  m['a'] = &a;
  cout << m['a']->size << endl;
}
int main(){
  f();
  cout << m['a']->size << endl;
}

出力は

3
0

理由はfで作ったAのインスタンスが関数を抜けたときに破棄されるからで、スコープを抜けたときもmapにAの情報を保持したい場合は

void f(){
  m['a'] = new A(3);
  cout << m['a']->size << endl;
}

とか書けばよい。(この場合mに登録したインスタンスが不要になった時にdeleteを呼ばないとメモリリークを引き起こす)
Javaを使っていると到達可能なオブジェクトが消えたりしないので結構はまった。