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()));