JavaからC++へのshared_ptrを用いた移植

最近Javaで書いたプログラム(1万行ほど)をC++に移植しました.プログラムの構造はあまり変えたくなく,またメモリ管理についてあまり考えたくなかったのでshared_ptrを使って以下のように機械的に変換したところ,とりあえずSegmentation Faultなく動きました.最近のC++はスマートポインタのお陰でdeleteを一度も書かずにプログラムを書けるようです.

  • オブジェクトの参照を返すメソッド→shared_ptr(not参照)を返すメソッド
// Java
public ClassA createClassA() {
	return new ClassA();
}
// C++
shared_ptr<ClassA> createClassA() {
	return shared_ptr<ClassA>(new ClassA());
}
  • オブジェクトの参照を引数に持つメソッド→shared_ptrの参照を引数に持つメソッド
// Java
public void receiveClassA(ClassA a) {
	a.doSomething();
}
// C++
void receiveClassA(const shared_ptr<ClassA>& a) {
	a->doSomething();
}
  • オブジェクトの参照をメンバに持つクラス→shared_ptr(not参照)をメンバに持つクラス
// Java
class ClassB {
	private ClassA a;
	public ClassB(ClassA a) {
		this.a = a;
	}
}
// C++
class ClassB {
private:
	const shared_ptr<ClassA> a;
public:
	ClassB(const shared_ptr<ClassA>& a) : a(a) {
	}
};
  • オブジェクトの参照を格納するコンテナ→shared_ptr(not参照)を格納するコンテナ
// Java
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
// C++
vector<shared_ptr<ClassA> > vec;
vec.push_back(shared_ptr<ClassA>(new ClassA()));